- Mysql tables to php classes
- Saved searches
- Use saved searches to filter your results more quickly
- stevenflesch/table2class
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README
- About
- Resources
- Stars
- Watchers
- Forks
- Releases
- Packages 0
- Languages
- Footer
Mysql tables to php classes
У меня, собственно, такой вопрос. Сейчас занимаюсь написанием небольшой CMS для сайта, поставил себе целью по максимуму использовать ООП. Хочу получить правильные с логической точки зрения классы для работы с таблицами.
Для примера. Есть у меня таблица 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 ;
>
>
?>
Дело в том, что это мой первый опыт работы с ООП и я пока не полностью себе представляю все принципы работы. По поводу того как это будет работать у меня претензий нет, а вот правильно ли это логически?
Метод select_page($id) выбирает id страницы, с которой будем работать.
Метод init_page() загружает остальные данные по уже определённому id.
Метод delete_page() удаляет загруженную страницу.
Метод edit_page() редатирует её.
Сомнения возникли, когда стал писать метод add_page. Как то нелогично выходит, определять id мы не будем. Вобщем метод работает как функция, которой могло бы и не быть в классе. Как правильно? Может быть создавать объект, задавать его данные, а потом уже делать что-то вроде add_page()? Но это ставит под вопрос остальные мои методы.
Вобщем ситуация простая, хотелось бы спросить у компетентных людей, как бы они организовали эту несложную задачу.
Для начала, определитесь с версией PHP. То, что Вы написали — это под 4-ю версию. Если хотите максимально использовать ООП, ориентируйтесь на php5 и изучите различия в подходе к ООП в этих двух версиях PHP.
А вообще в такой задачи трудно что-либо предложить, сделайте, например так:
class Page
public function select_page ( $id )
$query = «SELECT * FROM `pages` WHERE `id`=’ $id ‘» ;
$result = mysql_query ( $query );
if( mysql_num_rows ( $result )== 0 ) return FALSE ;
>
else return mysql_fetch_array ( $result );
>
public function delete_page ( $id ) $query = «DELETE FROM `pages` WHERE `id`=’ $id ‘» ;
if( mysql_query ( $query )) return TRUE ;
else return FALSE ;
>
public function edit_page ( $id , $title , $text ) $query = «UPDATE `pages` SET title=’ $title ‘, text=’ $text ‘ WHERE `id`=’ $id ‘» ;
if( mysql_query ( $query )) return TRUE ;
else return FALSE ;
>
public function add_page ( $title , $text ) $query = «INSERT INTO `pages` (`title`, `text`) values (‘ $title ‘, ‘ $text ‘)» ;
if( mysql_query ( $query )) return TRUE ;
else return FALSE ;
>
>
Нет смысла каждый раз вызывать отдельный метод для выбора id страницы, проще его передавать. В итоге получается просто набор функций, оформленных в класс.
Это не совсем то, что мне хотелось бы видеть. Использование классов получается нецелесообразным. Может кто-то может подсказать общую структуру и суть класса, который бы использовался для работы с SQL в целом? Функции: добавление, удаление, редактирование, просмотр. Просто он же должен работать с разными таблицами и полями — как это сделать удобнее всего?
Мне пришла в голову некоторая идея, хочу у вас узнать имеет ли она право на жизнь. Хочу сделать класс для работы с MySQL. Методы — подключение к БД, выбор таблицы, отключение, удаление, редактирование, добавление. Для редактирования и добавления в кач-ве аргумента подавать массив пар поле-значение или 2 массива — один с полями, другой со значениями и потом основываясь на этом генерировать запрос. Также можно для удобства сделать метод, который будет готовить эти массивы для методов добавления-редактирования.
Посмотри прикрепленный файл. Давно использую нечто подобное в своих проектах.
Есть базовый класс: db_base.
В нем реализованы методы либо абстрактно, либо те, которые не привязаны к конкретной СУБД.
Есть класс, драйвер конкретной СУБД, например: MySQL.php, класс db extends db_base
В этом классе реализованы только те методы, которые зависят от выбора конкретной СУБД (MySQL, PostgreSQL и т.п.), т.е. это драйвер конкретной СУБД.
Есть еще скрипт с набором функций: db.php
В нем создается объект класса db (выбранного драйвера СУБД) и реализована оболочка для всех функций класса.
Например:
$r = db_select ( «kernel_cron» , «cron_func, cron_type» , «cron_time< color: #007700">. time (), «cron_type» );
while ( $f = db_fetch_assoc ( $r ) )
<
.
>
db_free_result ( $r );
Спасибо.
Форма и способы мне сейчас не так интересны, как суть.
Т.е. ход мыслей правильный?
Есть класс для работы с БД. Т.е. все методы, нужные для обработки данных, не привязанных к какому-то типу БД. Потом расширенные классы для работы с каждой БД в отдельности. Я понимаю, что вы сейчас сказали то же самое, но мне хотелось описать это своими словами и получить подтверждение. За файлы и текст спасибо, но мне в данный момент хочется написать все самому, без оглядки на существующие готовые классы.
Очень понравился ваш вариант, но копипастить смысла нет — хочется до всего дорасти самому, но, безусловно, оглядка на такой продукт в моменты сомнений будет очень полезна. Ещё раз спасибо.
Есть класс для работы с БД. Т.е. все методы, нужные для обработки данных, не привязанных к какому-то типу БД. Потом расширенные классы для работы с каждой БД в отдельности. |
Да, Вы все правильно поняли. Уверен, что с таким подходом у Вас будут большие перспективы.
P.S. пример не для копипаста, а для демонстрации подхода.
Можете еще глянуть, как такое реализуется в готовых движках, например, в phpBB2 реализован похожий подход (но мне он не очень понравился).
Привязывать код к работе только с конкретной СУБД (например, MySQL) не дальновидно. Завтра может потребоваться другая СУБД, а переписывать все скрипты — неоправданно трудная задача.
Я пользую для общения с мускулом следующее:
Вобщем далеко от совершенства, но общая идея смысла не лишена. Вам же не конечный результат требуется, а реализация потенциала ООП? Тут она есть))
setDbhost("localhost"); $this->setDbname("ez_report"); $this->setDbuser($dbuser); $this->setDbpassword($dbpassword); > /** * геттеры и сеттеры * */ private function setDbhost($dbhost) < $this->dbhost=$dbhost; > private function getDbhost() < return $this->dbhost; > private function setDbname($dbname) < $this->dbname=$dbname; > private function getDbname() < return $this->dbname; > private function setDbuser($dbuser) < $this->dbuser=$dbuser; > private function getDbuser() < return $this->dbuser; > private function setDbpassword($dbpassword) < $this->dbpassword=$dbpassword; > private function getDbpassword() < return $this->dbpassword; > /** * Устанавливает строку запроса * */ public function setSql($sql) < $this->sql=$sql; > private function getSql() < return $this->sql; > private function setResult($result) < $this->result=$result; > public function getResult() < return $this->result; > /** * Подключение к базе, сеттер $link * */ private function setLink() < $this->link=mysql_connect($this->getDbhost(),$this->getDbuser(),$this->getDbpassword()); mysql_query('SET NAMES utf8',$this->getLink()) or trigger_error("ошибка при установке кодовой страницы:".mysql_error()); mysql_query ("set character_set_client='utf8',$this->getLink()") or trigger_error("ошибка при установке кодовой страницы:".mysql_error()); mysql_query ("set character_set_results='utf8'"); mysql_query ("set collation_connection='utf8_bin',$this->getLink()") or trigger_error("ошибка при установке кодовой страницы:".mysql_error()); > private function getLink() < return $this->link; > /** * Преобразование ответа mysql в массив. * @returns $raw - массив с результатом sql-запроса * */ public function resultToArray() < $raw=array(); while($raw[]=mysql_fetch_array($this->getResult(),MYSQL_ASSOC)); array_pop($raw); return $raw; > /** * Выполнение SQL запроса. * */ public function sqlExec() < $this->setLink(); mysql_select_db($this->getDbname(),$this->getLink()); //mysql_query($this->getSql(),$this->getLink()); $res=mysql_query($this->getSql(),$this->getLink()) or trigger_error("error executing sql: ".mysql_error()); $this->setResult($res); mysql_close($this->getLink()); > >
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
stevenflesch / table2class Public archive
Easily create PHP class definitions from MySQL tables using PHP/jQuery.
stevenflesch/table2class
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README
Project Description ==================================== table2class is a lightweight PHP script that creates class definitions from MySQL tables automatically. It is released under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and the source code is available on GitHub. More information about this script can be found at the project homepage located at: http://www.stevenflesch.com/projects/table2class/ Contributions ==================================== Code formatting functions use a class provided under a Creative Commons Attribution 3.0 United States License from Daniel Lubarov at indented.net. The database class and project idea is based loosely on an idea from Marco Voegeli at www.voegeli.li. Usage ==================================== *Please note: Your MySQL user must have LIST DATABASES permissions.* You must have write permissions on the /output/ directory. To use: * Place table2class directory somewhere on your web server. * Ensure you have a MySQL user with LIST DATABASES permissions. * Enter server credentials. Press Connect button. * Select database, table, and primary key field. * Enter the name of the class and click Generate button. * Your class file will be generated in the output/ folder. * When using your class, remember that the file: *output/class.database.php is REQUIRED*. License ===================================== table2class by Steven Flesch is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
About
Easily create PHP class definitions from MySQL tables using PHP/jQuery.
Resources
Stars
Watchers
Forks
Releases
Packages 0
Languages
Footer
You can’t perform that action at this time.