Очередная вариация на бесконечную тему библиотек для работы с БД. Документация и исходники — http://pyha.ru/go/godb/ Расширение над MySQLi Облегчает интерфейс взаимодействия с БД. Никакой дополнительной абстракции над SQL не строит. - Упрощенное формирование запроса - Упрощенный разбор результата - Обработка ошибок на основании исключений - Плюс еще несколько полезных фишек
Ночь наглой рекламы на MTV. За прошедшие с первого сообщения года в библе накопилось: - Плейсхолдеры для вставки в запрос данных на любой вкус. - Форматы представления результата на любые случаи жизни. - Именованные плейсхолдеры, как альтернатива регулярным. - Длинные плейсхолдеры, для особых гурманов. - Итераторы наравне с массивами для оптимизации разбора результата. - Пространства имён для компактного хранения всего барахла. - Автоматические префиксы таблиц без лишнего мозгоё..ва. - Удобное хранение конфигурации и отложенные подключения. - Декораторы запросов, отладка и иерархия исключений для отлова ошибок. И, наконец, переписана документация по библиотеке. Она по-прежнему убогая на вид, но теперь в ней отражено всё, что надо. Домохозяйки всего мира выбирают goDB! качать тут | читать здесь
PHP: <? public function fetch($result, $fetch) { $fetch = strToLower($fetch); if ((!$fetch) || ($fetch == 'no')) { return $result; } if ($fetch == 'id') { return $this->insert_id; } if ($fetch == 'ar') { return $this->affected_rows; } $numRows = $result->num_rows; if ($fetch == 'num') { return $numRows; } if ($fetch == 'row') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $A[] = $result->fetch_row(); } return $A; } if ($fetch == 'assoc') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $A[] = $result->fetch_assoc(); } return $A; } if ($fetch == 'col') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $r = $result->fetch_row(); $A[] = $r[0]; } return $A; } if ($fetch == 'object') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $A[] = $result->fetch_object(); } return $A; } if ($fetch == 'vars') { $A = Array(); for ($i = 0; $i < $numRows; $i++) { $r = $result->fetch_row(); $A[$r[0]] = $r[1]; } return $A; } if ($fetch == 'irow') { return new goDBResultRow($result); } if ($fetch == 'iassoc') { return new goDBResultAssoc($result); } if ($fetch == 'icol') { return new goDBResultCol($result); } if ($fetch == 'iobject') { return new goDBResultObject($result); } if ($numRows == 0) { if (!in_array($fetch, array('rowrow', 'rowassoc', 'rowobject', 'el'))) { throw new goDBExceptionFetch($fetch); } return false; } if ($fetch == 'rowrow') { return $result->fetch_row(); } if ($fetch == 'rowassoc') { return $result->fetch_assoc(); } if ($fetch == 'rowobject') { return $result->fetch_object(); } if ($fetch == 'el') { $r = $result->fetch_row(); return $r[0]; } throw new goDBExceptionFetch($fetch); } PHP: <? class goDB extends mysqli interface goDBException {} abstract class goDBRuntimeException extends RuntimeException implements goDBException {} abstract class goDBLogicException extends LogicException implements goDBException {} class goDBExceptionConnect extends goDBRuntimeException {} class goDBExceptionQuery extends goDBLogicException abstract class goDBExceptionData extends goDBLogicException {} class goDBExceptionDataMuch extends goDBExceptionData {} class goDBExceptionDataNotEnough extends goDBExceptionData {} class goDBExceptionDataPlaceholder extends goDBExceptionData class goDBExceptionDataMixed extends goDBExceptionData {} class goDBExceptionFetch extends goDBLogicException abstract class goDBExceptionDB extends goDBLogicException {} class goDBExceptionDBAlready extends goDBExceptionDB {} class goDBExceptionDBNotFound extends goDBExceptionDB {} abstract class goDBResult implements Iterator, ArrayAccess, Countable class goDBResultRow extends goDBResult class goDBResultAssoc extends goDBResult class goDBResultCol extends goDBResult class goDBResultObject extends goDBResult
ИМХО ошибка проектирования не лучше ли extends ArrayObject? Пользовательские методы работают гораздо медленнее.
Опишите, как ArrayObject обойдётся в данном случае без пользовательских методов. Это я могу услышать и от мр.Мита. Не могли бы хотя бы вы подвести под свои слова аргументационную базу.
vasa_c рябит от такого кол-ва if. до 5ти условий еще норм, для большего кол-ва же другую штуку придумали.
Нет, я хотел совершенно не этого. Я всего лишь хотел поговорить о водочке. Ну да, ладно. В других местах критики говорили об ORM, Query-бюлдерах, адаптерах и другой архитектурной чепухе. Здесь же, наконец, опустились до самой сути - конструкуциях ветвления внутри конкретного метода. И, да, да! Есть такая конструкция, которая позволяет заменить ифы - switch, позор на мою седую голову. Вот правда одним свичем, если приглядеться там не заменить всё. Перед некотороми группами ветвлений производяться некоторые общие для них вычисления. И следовательно либо нужно эти вычисления копипастить в ветки свича, либо вместо одного делать несколько свичей. А несколько раздельных switch вместо несколько if, это уже настолько глубокий и тонкий разговор о красоте кодирования, который мне просто недоступен, простите.
ну да, при детально рассмотрении использование ArrayObject позволит выкинуть только один метод PHP: <? public function offsetUnset($offset) { return false; } =))))) А тут не ошибка кстати? PHP: <? public function offsetExists($offset) { return (($offset >= 0) && ($offset < $numRows)); } откуда $numRows?
кстати, неоднократно слышал, что ArrayObject жутко медленный и если его руками переписать - то будет быстрее работать. проверять лень.
эм, PHP: <?php switch ($fetch) { case 'assoc': $method = 'fetch_assoc'; break; case 'num': $method = 'fetch_num'; break; // .... } $A = Array(); for ($i = 0; $i < $numRows; $i++) { $r = $result->$method(); $A[$r[0]] = $r[1]; } return $A; Ну и прочее как-то так. В общем не стоит забывать, что PHP это умеет. Иногда это снижает copy-paste очень сильно
или даже массивом завернуть) подстановку плейсхолдеров в отдельный класс вынести б вообще идея наследования от mysqli не самая удачная имхо. Лучше создать инстанцию это mysqli
+1. Делегирование намного упрощает жизнь, особенно если планируется делать драйвера для других СУБД - сразу будет видно, что можно выносить...
Psih, ну ты бы хоть по сути написал, а не по IF. да, в массив завернуть было бы ещё круче или даже не заворачивать: PHP: $method = 'fetch'.$method; return $this->$method($result); Вот только куча методов против кучи if'ов - стоит ли этот спор высосанного х.йца? И дёргать лишний метод не надо.
уменьшить ответственность да и ваще синглтон/мультитон есть моветон. это типа байтдроч?) а создавать инстанию класса на каждый результат надо?)