На сколько грамотно использовать обёртку работы с БД

sanu0074

Новичок
С БД очень удобно работать с помощью вшитой в PHP - PDO, но работу с ней можно еще более упростить, написав свою обёртку.
Например, для того чтобы сократить код и некоторые запросы можно было делать одной коротенькой строчкой, а не писать что то вроде:
PHP:
$q=$dbh->prepare("SELECT FROM table WHERE ........");
$q->execute(array("params"));
$arr=$q->fetchAll();
А делать просто, напиав класс который позволит делать так:
PHP:
$table=new DBase("table");
$arr=$table->select(array("fields"),"conditioin",array("params"));
Таким образом уже в $arr - есть все что надо.
Основной плюс такого подхода, что в такой класс DBase можно натыкать кучу разных полезных методов, например таких как в есть в Yii - selectByPK(), и пр. что только придет в голову.
Но если использовать такой класс повсюду в своем проекте, это сильно нагрузит сервер?
И вообще, что скажете об этой идее?
Нужны ваши мнения и советы....
 

Василий М.

Новичок
моё - http://www.phpinfo.su/articles/additionally/klass_dlja_bezopasnoj_raboty_s_subd_mysql.html
Фаната - http://phpfaq.ru/safemysql

А делать просто, напиав класс который позволит делать так:
это не обертка. Это слабое подобие билдера запросов и у него другая функция, нежели у обертки.

это уже не относится ни к обертке, ни к билдеру. Это элемент слоя, такого как DataMapper или Row Data Gateway.
 

AmdY

Пью пиво
Команда форума
Zend Framework и Symfony используют в хайлодах, так что твоя обёртка совсем не скажется на производительности тем более она позволит легко встроить кэширование.
 

riff

Новичок
По-моему скромному мнению тебя через 10 минут задолбает писать для каждого нового запроса
$table=new DBase("table");
а через пол-часа, когда начнутся inner join'ы, ты запутаешься в
$arr=$table->select(array("fields"),"conditioin",array("params"));
Пиши sql полностью, а вот с параметрами, да, лучше через плэйсхолдеры.

Основной плюс такого подхода, что в такой класс DBase можно натыкать кучу разных полезных методов
Мой вариант

Только обсуждения по ссылкам почитай, и здесь и в теме Фаната.
 

Фанат

oncle terrible
Команда форума
Это не нагрузит сервер, но такой детсадовский квери-билдер годится только для детсадовской же работы с БД.
при этом упрощения особого не получается всё равно.

Ты тот же самый запрос просто расчленил, а потом собрал из него франкенштейна.

Вот твой код
PHP:
$table=new DBase("table");
$arr=$table->select(array("fields"),"conditioin",array("params"));
А вот чистый ПДО
PHP:
$sql = "SELECT * FROM table WHERE condition = ?";
$arr = $db->prepare($sql)->execute(array("params"))->fetch();
Разницы в объеме почти нет, но при этом любой человек, который будет читать этот код потом, поймет SQL с первого раза, а в твою абракадабру будет втыкать долго.

А теперь представим, что нам надо не =, а больше или там BETWEEN. И сравнить с CURDATE(). В случае с PDO переписываем только запрос

PHP:
$sql = "SELECT * FROM table WHERE condition BETWEEN ? AND CURDATE()";
$arr = $db->prepare($sql)->execute(array("params"))->fetch();
А на твоем голубином языке это как написать?
 
Последнее редактирование:

sanu0074

Новичок
Это не нагрузит сервер, но такой детсадовский квери-билдер годится только для детсадовской же работы с БД.
при этом упрощения особого не получается всё равно.

Ты тот же самый запрос просто расчленил, а потом собрал из него франкенштейна.

Вот твой код
PHP:
$table=new DBase("table");
$arr=$table->select(array("fields"),"conditioin",array("params"));
А вот чистый ПДО
PHP:
$sql = "SELECT * FROM table WHERE condition = ?";
$arr = $db->prepare($sql)->execute(array("params"))->fetch();
Разницы в объеме почти нет, но при этом любой человек, который будет читать этот код потом, поймет SQL с первого раза, а в твою абракадабру будет втыкать долго.

А теперь представим, что нам надо не =, а больше или там BETWEEN. И сравнить с CURDATE(). В случае с PDO переписываем только запрос

PHP:
$sql = "SELECT * FROM table WHERE condition BETWEEN ? AND CURDATE()";
$arr = $db->prepare($sql)->execute(array("params"))->fetch();
А на твоем голубином языке это как написать?
Либо до лепить функцию которая будет предназначена для выполнения такого рода запроса (сделать перебор массива с параметрами\операторами), либо забить х** и использовать здесь SQL запрос в таком виде как он есть, а для остальных (простых запросов) использовать велосипед:
PHP:
$row=$table->selectByPK($pkVal);
Все же поможет сократить простые запросы, а их в проекте куча
 

AmdY

Пью пиво
Команда форума
@Фанат на его языке будет
PHP:
$arr =new DBase("table")->select(["*"],"condition BETWEEN ? AND CURDATE()",[$startDate]);
 

Фанат

oncle terrible
Команда форума
О, прикольно, нотификации!
@AmdY не беги вперёд паровоза.
Во-первых, у него ещё ничего этого нету.
Во-вторых, кроме WHERE есть еще другие операторы. Я ж ведь попрошу написать запрос с группировкой и сортировкой. И - оцени мою гуманность - я до сих пор не произнёс слово на букву ДЖ... ;)
И в итоге, пока вся прогрессивная общественность бьётся за именованные операторы в пхп функциях, здась мы наоборот - разыменовываем операторы SQL, ради сомнительной радости сокращения количества нажимаемых кнопок.
 

Фанат

oncle terrible
Команда форума
В Yii - selectByPK() - это не детсадовский вариант сокращения запросов, а метод модели.

Если у тебя "куча" простых запросов, то думать надо об оптимизации кода и об изучении SQL, а не о том, каким сахаром посыпать говнокод.
 

AmdY

Пью пиво
Команда форума
ну у него в примере действительно
$table->select(array("fields"),"conditioin",array("params"));, так что where должно работать из коробки, если пример правдивый.
Другое дело, что писать такое самому дело неблагодарное, уже есть масса решений для table getway, ar, orm
 

hell0w0rd

Продвинутый новичок
преждевременная оптимизация - зло. ТС, делай как удобнее, а потом будешь смотреть что "нагружает сервер"
 

sanu0074

Новичок
В общем кое-что слепил вчера.
Написал библиотеку для codeIgniter, ее прописываем в автозагрузке или инклудим из основного класса, и после, в любом месте можно делать так: $table = new Db("table_name");
Есть некоторые методы упрощающие простые запросы, типа selectByPK, updateByPK и пр., в комментах написал что какой метод делает.
Почему это использую в CI? - потому что никогда его родным драйвером работы с бд не пользовался, мне не нравится он, всегда его отключал и юзал PDO без всякого, а это вот решил пострадать фигней.... вобщем смотрите и скажите как там я много ошибок допустил
 

Вложения

  • 2,6 KB Просмотры: 4

hell0w0rd

Продвинутый новичок
Как минимум:
  • не используешь vcs
  • кодировка
  • этот код читать не возможно
  • нет тестов
  • все захардоджено
  • какой-то костыль вместо phpdoc
  • $i<count($newParams)
Возьми что-то готовое и используй какое-то время, потом поймешь минусы и плюсы и напишешь свое, но уже с некоторым пониманием)
 

riff

Новичок
к вышесказанному:
* прекрати писать в строчку
* прекрати писать без пробелов
ты не экономишь ни копейки
* перестань у комментариев перед функциям сбивать отступ.

О классе:
Ты устанешь от всего этого. Нет, не сегодня и не через месяц. А вот месяца через три, когда у тебя будет 100500 файликов, и когда нужно будет вдруг добавить табличек, добавить фильтров, писать составные запросы... ты устанешь добавлять функциональность своему классу, следить чтоб добавленное новое не ломало написанное раньше. Ты увидишь, что твой класс не уменьшает кол-во написанного sql, коверкает - да, но не уменьшает - ты устанешь вспоминать и пытаться понимать написанное самим же.

Я тебе давал ссылку на свой класс. Ты думаешь там не было всего этого? Было. И update и delete, и select и с параметрами и без - стёр всё к чёрту, оставил практически в таком виде как сейчас. Как оказалось, sql приятней читать текстом, а не складывать в уме из кубиков.

---Добавлено позже---
$CI =& get_instance();
$this->dbh =& $CI->user->dbh;

Для объектов не создается копий при передаче их другой переменной или в качестве параметров. "&" там лишний (это, если не считая, что всё остальное тоже плохо ) ).
 
Последнее редактирование:
Сверху