За последние 24 часа нас посетили 18239 программистов и 1634 робота. Сейчас ищут 1711 программистов ...

goDB — библиотека работы с MySQL

Тема в разделе "Решения, алгоритмы", создана пользователем vasa_c, 10 фев 2008.

  1. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Очередная вариация на бесконечную тему библиотек для работы с БД.

    Документация и исходники — http://pyha.ru/go/godb/

    Расширение над MySQLi
    Облегчает интерфейс взаимодействия с БД.
    Никакой дополнительной абстракции над SQL не строит.

    - Упрощенное формирование запроса
    - Упрощенный разбор результата
    - Обработка ошибок на основании исключений
    - Плюс еще несколько полезных фишек
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Ночь наглой рекламы на MTV.

    За прошедшие с первого сообщения года в библе накопилось:

    - Плейсхолдеры для вставки в запрос данных на любой вкус.
    - Форматы представления результата на любые случаи жизни.
    - Именованные плейсхолдеры, как альтернатива регулярным.
    - Длинные плейсхолдеры, для особых гурманов.
    - Итераторы наравне с массивами для оптимизации разбора результата.
    - Пространства имён для компактного хранения всего барахла.
    - Автоматические префиксы таблиц без лишнего мозгоё..ва.
    - Удобное хранение конфигурации и отложенные подключения.
    - Декораторы запросов, отладка и иерархия исключений для отлова ошибок.

    И, наконец, переписана документация по библиотеке.
    Она по-прежнему убогая на вид, но теперь в ней отражено всё, что надо.

    Домохозяйки всего мира выбирают goDB!

    качать тут | читать здесь
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    дежавю?
     
  4. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Без понятия, на что у вас дежавю и куда у вас дежавю.
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    PHP:
    1.  
    2. <?
    3.  
    4. public function fetch($result, $fetch) {
    5.         $fetch = strToLower($fetch);
    6.         if ((!$fetch) || ($fetch == 'no')) {
    7.             return $result;
    8.         }
    9.         if ($fetch == 'id') {
    10.             return $this->insert_id;
    11.         }
    12.         if ($fetch == 'ar') {
    13.             return $this->affected_rows;
    14.         }
    15.         $numRows = $result->num_rows;
    16.         if ($fetch == 'num') {
    17.             return $numRows;
    18.         }
    19.         if ($fetch == 'row') {
    20.             $A = Array();
    21.             for ($i = 0; $i < $numRows; $i++) {
    22.                 $A[] = $result->fetch_row();
    23.             }
    24.             return $A;
    25.         }
    26.         if ($fetch == 'assoc') {
    27.             $A = Array();
    28.             for ($i = 0; $i < $numRows; $i++) {
    29.                 $A[] = $result->fetch_assoc();
    30.             }
    31.             return $A;
    32.         }
    33.         if ($fetch == 'col') {
    34.             $A = Array();
    35.             for ($i = 0; $i < $numRows; $i++) {
    36.                 $r = $result->fetch_row();
    37.                 $A[] = $r[0];
    38.             }
    39.             return $A;
    40.         }
    41.         if ($fetch == 'object') {
    42.             $A = Array();
    43.             for ($i = 0; $i < $numRows; $i++) {
    44.                 $A[] = $result->fetch_object();            
    45.             }
    46.             return $A;
    47.         }
    48.         if ($fetch == 'vars') {
    49.             $A = Array();
    50.             for ($i = 0; $i < $numRows; $i++) {
    51.                 $r = $result->fetch_row();
    52.                 $A[$r[0]] = $r[1];
    53.             }
    54.             return $A;
    55.         }
    56.         if ($fetch == 'irow') {
    57.             return new goDBResultRow($result);
    58.         }
    59.         if ($fetch == 'iassoc') {
    60.             return new goDBResultAssoc($result);
    61.         }
    62.         if ($fetch == 'icol') {
    63.             return new goDBResultCol($result);
    64.         }
    65.         if ($fetch == 'iobject') {
    66.             return new goDBResultObject($result);
    67.         }        
    68.         if ($numRows == 0) {
    69.             if (!in_array($fetch, array('rowrow', 'rowassoc', 'rowobject', 'el'))) {
    70.                 throw new goDBExceptionFetch($fetch);
    71.             }
    72.             return false;
    73.         }
    74.         if ($fetch == 'rowrow') {
    75.             return $result->fetch_row();
    76.         }
    77.         if ($fetch == 'rowassoc') {
    78.             return $result->fetch_assoc();
    79.         }
    80.         if ($fetch == 'rowobject') {
    81.             return $result->fetch_object();
    82.         }        
    83.         if ($fetch == 'el') {
    84.             $r = $result->fetch_row();
    85.             return $r[0];
    86.         }
    87.         throw new goDBExceptionFetch($fetch);
    88.     }

    PHP:
    1. <?
    2. class goDB extends mysqli
    3. interface goDBException {}
    4. abstract class goDBRuntimeException extends RuntimeException implements goDBException {}
    5. abstract class goDBLogicException extends LogicException implements goDBException {}
    6. class goDBExceptionConnect extends goDBRuntimeException {}
    7. class goDBExceptionQuery extends goDBLogicException
    8. abstract class goDBExceptionData extends goDBLogicException {}
    9. class goDBExceptionDataMuch extends goDBExceptionData {}
    10. class goDBExceptionDataNotEnough extends goDBExceptionData {}
    11. class goDBExceptionDataPlaceholder extends goDBExceptionData
    12. class goDBExceptionDataMixed extends goDBExceptionData {}
    13. class goDBExceptionFetch extends goDBLogicException
    14. abstract class goDBExceptionDB extends goDBLogicException {}
    15. class goDBExceptionDBAlready  extends goDBExceptionDB {}
    16. class goDBExceptionDBNotFound extends goDBExceptionDB {}
    17. abstract class goDBResult implements Iterator, ArrayAccess, Countable
    18. class goDBResultRow extends goDBResult
    19. class goDBResultAssoc extends goDBResult
    20. class goDBResultCol extends goDBResult
    21. class goDBResultObject extends goDBResult
     
  6. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Господин Д'Артаньян, видимо, хочет выразить мнение, что это сраное говно. Верно?
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    я подчеркнул достоинства. разве не видно?
     
  8. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Надо будет обязательно потестить
     
  9. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    ну с виду похоже во всяком случае))
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ИМХО ошибка проектирования
    не лучше ли extends ArrayObject? Пользовательские методы работают гораздо медленнее.
     
  11. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Опишите, как ArrayObject обойдётся в данном случае без пользовательских методов.

    Это я могу услышать и от мр.Мита.
    Не могли бы хотя бы вы подвести под свои слова аргументационную базу.
     
  12. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    vasa_c
    рябит от такого кол-ва if. до 5ти условий еще норм, для большего кол-ва же другую штуку придумали.
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну ты же этого и хотел, создавая тему :)
    чего отпираться то теперь. холиварщик.
     
  14. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Нет, я хотел совершенно не этого. Я всего лишь хотел поговорить о водочке.

    Ну да, ладно.
    В других местах критики говорили об ORM, Query-бюлдерах, адаптерах и другой архитектурной чепухе.
    Здесь же, наконец, опустились до самой сути - конструкуциях ветвления внутри конкретного метода.

    И, да, да! Есть такая конструкция, которая позволяет заменить ифы - switch, позор на мою седую голову.

    Вот правда одним свичем, если приглядеться там не заменить всё.
    Перед некотороми группами ветвлений производяться некоторые общие для них вычисления.
    И следовательно либо нужно эти вычисления копипастить в ветки свича, либо вместо одного делать несколько свичей.

    А несколько раздельных switch вместо несколько if, это уже настолько глубокий и тонкий разговор о красоте кодирования, который мне просто недоступен, простите.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ну да, при детально рассмотрении использование ArrayObject позволит выкинуть только один метод
    PHP:
    1. <?
    2.     public function offsetUnset($offset) {
    3.         return false;
    4.     }
    =)))))

    А тут не ошибка кстати?
    PHP:
    1. <?
    2.     public function offsetExists($offset) {
    3.         return (($offset >= 0) && ($offset < $numRows));
    4.     }
    откуда $numRows?
     
  16. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в других местах мы говорили о промышленных стандартах)
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    кстати, неоднократно слышал, что ArrayObject жутко медленный и если его руками переписать - то будет быстрее работать.

    проверять лень.
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Koc
    Проверял, наоборот.
     
  19. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Совершенно ниоткуда. Спасибо за баг-репорт :)
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    эм,
    PHP:
    1. <?php
    2.  
    3. switch ($fetch) {
    4.     case 'assoc':
    5.         $method = 'fetch_assoc';
    6.         break;
    7.     case 'num':
    8.         $method = 'fetch_num';
    9.         break;
    10. // ....
    11. }
    12.  
    13. $A = Array();
    14. for ($i = 0; $i < $numRows; $i++) {
    15.     $r = $result->$method();
    16.     $A[$r[0]] = $r[1];
    17. }
    18. return $A;
    19.  
    Ну и прочее как-то так. В общем не стоит забывать, что PHP это умеет. Иногда это снижает copy-paste очень сильно :)
     
  21. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    или даже массивом завернуть)


    подстановку плейсхолдеров в отдельный класс вынести б
    вообще идея наследования от mysqli не самая удачная имхо. Лучше создать инстанцию это mysqli
     
  22. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    +1. Делегирование намного упрощает жизнь, особенно если планируется делать драйвера для других СУБД - сразу будет видно, что можно выносить...
     
  23. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Psih, ну ты бы хоть по сути написал, а не по IF.
    да, в массив завернуть было бы ещё круче или даже не заворачивать:
    PHP:
    1.  
    2. $method = 'fetch'.$method;
    3. return $this->$method($result);
    4.  
    Вот только куча методов против кучи if'ов - стоит ли этот спор высосанного х.йца?
    И дёргать лишний метод не надо.
     
  24. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Насколько часто это приходилось делать?

    смысл?
     
  25. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    уменьшить ответственность

    да и ваще синглтон/мультитон есть моветон.

    это типа байтдроч?) а создавать инстанию класса на каждый результат надо?)