class DataBase
{
function select(); // запрос SELECT, функция возвращает множество результатов, массив хэшей. каждый элемент - строка в таблице.
function selectOne(); // запрос SELECT, функция возвращает хэш - одну строку в таблице.
function execSQL(); // запрос UPDATE или DELETE (например), возвращает 1 или 0 (выполнен/не выполнен)
...
}
Правильная организация класса для работы с таблицей mysql
Для примера. Есть у меня таблица pages, которая состоит из полей id, title, и текст и нужна для вывода статических страниц на сайте. Мне нужен класс, который будет выполнять следующие функции:
-добавление записи;
-редактирование записи;
-удаление записи;
-сбор данных и вывод существующей записи.
Получилось вот что, но я думаю, что это не совсем правильно:
Код:
<?
class Page {
var $id;
var $title;
var $text;
function select_page($id) {
$id=int($id);
$this->id=$id;
}
function init_page() {
$query="SELECT * FROM `pages` WHERE `id`='$this->id'";
$result=mysql_query($query);
if(mysql_num_rows($result)==0) {
return FALSE;
}
else {
$row=mysql_fetch_array($result);
$this->title=$row['title'];
$this->text=$row['text'];
return TRUE;
}
}
function delete_page() {
$query="DELETE FROM `pages` WHERE `id`='$this->id'";
if(mysql_query($query)) return TRUE;
else return FALSE;
}
function edit_page($title, $text) {
$query="UPDATE `pages` SET title='$title', text='$text' WHERE `id`='$this->id'";
if(mysql_query($query)) return TRUE;
else return FALSE;
}
function add_page($title, $text) {
$query="INSERT INTO `pages` (`title`, `text`) values ('$title', '$text')";
if(mysql_query($query)) return TRUE;
else return FALSE;
}
}
?>
class Page {
var $id;
var $title;
var $text;
function select_page($id) {
$id=int($id);
$this->id=$id;
}
function init_page() {
$query="SELECT * FROM `pages` WHERE `id`='$this->id'";
$result=mysql_query($query);
if(mysql_num_rows($result)==0) {
return FALSE;
}
else {
$row=mysql_fetch_array($result);
$this->title=$row['title'];
$this->text=$row['text'];
return TRUE;
}
}
function delete_page() {
$query="DELETE FROM `pages` WHERE `id`='$this->id'";
if(mysql_query($query)) return TRUE;
else return FALSE;
}
function edit_page($title, $text) {
$query="UPDATE `pages` SET title='$title', text='$text' WHERE `id`='$this->id'";
if(mysql_query($query)) return TRUE;
else return FALSE;
}
function add_page($title, $text) {
$query="INSERT INTO `pages` (`title`, `text`) values ('$title', '$text')";
if(mysql_query($query)) return TRUE;
else return FALSE;
}
}
?>
Дело в том, что это мой первый опыт работы с ООП и я пока не полностью себе представляю все принципы работы. По поводу того как это будет работать у меня претензий нет, а вот правильно ли это логически?
Метод select_page($id) выбирает id страницы, с которой будем работать.
Метод init_page() загружает остальные данные по уже определённому id.
Метод delete_page() удаляет загруженную страницу.
Метод edit_page() редатирует её.
Сомнения возникли, когда стал писать метод add_page. Как то нелогично выходит, определять id мы не будем. Вобщем метод работает как функция, которой могло бы и не быть в классе. Как правильно? Может быть создавать объект, задавать его данные, а потом уже делать что-то вроде add_page()? Но это ставит под вопрос остальные мои методы.
Вобщем ситуация простая, хотелось бы спросить у компетентных людей, как бы они организовали эту несложную задачу.
по типу
Код:
Можно чуть-чуть подробнее? Одну функцию целиком в упрощенном виде для примера. В каждой таблице разные поля и их особенности, как решается такая проблема? Вы совершенно правы, я собирался делать однотипные классы и для других таблиц, почти ничего в них не меняя, кроме этих самых полей.
Затем написан класс для работы со статьями, который и делает редактирование, правку и т.д.
В итоге прийдется попариться, чтоб написать классы. Но потом объём кода и мучений будет в итоге поменьше.
З.Ы.: и пишите сразу на пхп5) Там как раз и Exception используйте и прочее) Ну за разъяснениями - в ман=)
А так - всё уже давно написано. Zend FrameWorks
Нормально?
Цитата: mfender
А так - всё уже давно написано. Zend FrameWorks
или как вариант php ADODB
http://adodb.sourceforge.net/
А вот интересно - в своих проектах вы используете класс коннекта или затачиваете под лпределенную базу (имеется ввиду большие проекты а не домашние странички и сайты с малой нагрузкой)
Используем класс, который сам запросы генерит для простых случаев. А в сложных скармливаем тому же классу sql-запрос.
Используем фреймворки и отдельные классы для работы с СУБД. Скармливаем им кросс-СУБД SQL-запросы. В редких случаях, когда такой не написать - приходится изворачиваться по-другому.
Абстрактный класс для работы с БД вообще, который не привязан ни к одному типу, который будет работать с классами конкретных БД. Как то так. Я понимаю, что есть готовые решения, но хочется опыта и прогресса.
Цитата: NeverBC
Я решил реализовать такую вещь для своих проектов.
Абстрактный класс для работы с БД вообще, который не привязан ни к одному типу, который будет работать с классами конкретных БД. Как то так. Я понимаю, что есть готовые решения, но хочется опыта и прогресса.
Абстрактный класс для работы с БД вообще, который не привязан ни к одному типу, который будет работать с классами конкретных БД. Как то так. Я понимаю, что есть готовые решения, но хочется опыта и прогресса.
дерзай :) опыт еще никому не помешал )))
тем более, что ты еще просто учишься )
ИМХО, готовые решения будешь использовать тогда, когда будешь знать для чего оно и как, а не просто тупо брать и юзать )