Эмулятор PEAR DB средствами PDO с некоторым расширением функционала или простая надстройка над PDO

    Доброе время суток всем!
    Как обещал ранее, а также по просьбе некоторых пользователей хабра выкладываю в сеть новый вариант эмулятора PEAR DB сделанный на основе PDO и успешно работающий с новыми версиями PHP. Скачать можно здесь (из раздела Code, ветка trunk) или здесь, а также используя snv
    так: svn checkout svn://svn.code.sf.net/p/peardb2pdo/code/trunk peardb2pdo-code
    или так: svn checkout svn.code.sf.net/p/peardb2pdo/code/trunk peardb2pdo-code

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

    Лицензия: GNU General Public License .

    Далее подробнее ...

    Как написано в заголовке, все переписано под PDO и рассчитано на работу с последними версиях PHP.
    Код тестировался на одном (пока не завершенном) проекте. Работает вроде нормально. Пара функций специфична для MySQL но при желании от специфики можно избавиться (см. свойство класса $server). Добавлена возможность параметризированных запросов ну и прочие мелочи которые будут понятны из примеров ниже и кода класса, думаю любой разберётся. Пожелания и поправки приветствуются. Судя по отклику на первую статью проблема «соскока» с PEAR DB актуальна. Возможно стоило ещё потестировать и отполировать но люди торопят, просят скорее выложить, потому предлагаю сделать это вместе с теми кому это интересно и нужно.

    Замечания/предложения/правки просьба в личку или в дискуссию на страничке проекта с кусками кода который на Ваш взгляд стоит поправить или дополнить.

    Далее несколько примеров:

    1.Подключение
    require_once 'includes/classes/classERROR.php'; 
    require_once 'includes/classes/classMYSQLPDO.php';
    $db = new DB();
    
    $show_errors = false;
    $stop_after_error = false;
    $on_error_rollback = true;
    
    if(!$db->connect('localhost','user','pass',	'database','table_preffix_',$show_errors ,					$stop_after_error,	$on_error_rollback ))
    						{
    							echo "DB Connect Error!";
    							exit();
    						}
    


    2. Параметризованный запрос — Вариант 1:
    $params['person_id']=array('57FA56C2',8);
    $params['nickname']=array('USER',4);
    print_r($db->getAll("select * from persons WHERE person_id=:person_id and nickname=:nickname",$params));
    echo "  Число полей: ".$db->fcount();
    echo "  Число записей: ".$db->rcount();
    
    // Повтор запроса с другими параметрами
    
    $params['person_id']=array('2457A5F',7);
    $params['nickname']=array('ADMIN',5);
    print_r($db->repeat($params));
    echo "  Число полей: ".$db->fcount();
    echo "  Число записей: ".$db->rcount();
    


    3. Параметризованный запрос — Вариант 2:
    print_r($db->getRow("select * from persons WHERE person_id=? LIMIT 1",array('57FD56C2')));
    echo "  Число полей: ".$db->fcount();
    


    Параметр: $alias в функциях позволяет разделить SQL запросы на сессии (для случаев когда необходимо комбинировать несколько параметризированных запросов напр. в одном цикле (дабы не происходило смешивание параметров и результатов выполнения некоторых функций).

    Надеюсь не сильно всех утомил. Остальные возможности вполне очевидны и понятны из кода. Просьба сильно не пинать а при желании помочь довести код до ума т.к. потребность в нём, судя по письмам с просьбой выложить, реально есть и люди торопят. В случае обнаружения ошибок просьба уведомить автора.

    Спасибо за внимание. Надеюсь кому то помог. Если нет то просто посмотрите мои фотки :) там это поможет побороть расслабиться и забыть :)
    с Уважением Михаил Червоненко/Mikhail Tchervonenko.

    п.с. Класс обработки ошибок выложен в старом варианте со всеми недостатками, до него руки пока не дошли и возможно в скором будующем не дойдут (лично меня он устраивает в таком варианте как есть). Не вижу особой нужды что то в нем менять но если кто то его улучшит с радостью выложу его в проекте.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 15

      0
      $params['person_id']=array('57FA56C2',8);
      $params['nickname']=array('USER',5);
      

      Может быть вопрос глупый: почему параметром передается массив и что значит его второй элемент?
        0
        это не обязательные параметры см. binParam pdo php.net/manual/de/pdostatement.bindparam.php
          0
          сорри, массив просто удобен в случаях когда нужно передать несколько параметров для одного значения и если чило их может быть переменным.
            0
            bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
            Если это (8 и 5 в моем примере) тип, то почему не константой. Если длина, то почему не совпадает?
              0
              да, вы правы, кусок из кода вырезан, реальное имя пользователя поправи руками а за длиной не всмотрел, доеду до дома поправлю, спасибо за замечание :)
          0
          Почему — эмулятор?
          Это скорее — адаптер.
            0
            Хотя нет, эмулятор больше подходит
            0
            Такие посты вынуждают меня опубликовать свою библиотеку для работы с бд :(
            Есть ли толк?
              0
              ну, если эта библиотека эмулирует pear::db :-) и вас попросят её опубликовать
                0
                Схожие методы, только немного реализация другая.
                В любом случае это не повод для создания очередного топика :)
                  0
                  Вы поищите в сети подобную библиотеку, если не создавать топик то как людям искать нужное, суть хабра — делиться с другими. Или Вам известен другой способ поделиться не публикуя? У меня порядка 15 писем пришло с момента публикации первой стстьи с просьбой выложить новую реализацию, и это при том что код был уже доступен в сети. Поэтому, после очередного письма решил что имеет смысл написать тут. Может был неправ, теперь не уверен.
            • UFO just landed and posted this here
                0
                да я, в принципе, не зацикливаюсь ни на pear ни на php, но если люди просят, как отказать. Насчет globals спасибо, убрал, осталась (уже ненужная) строчка от старой библиотеки, не заметил. А prepared statements я и реализовал через PDO но только, как мне кажется, сделал это более удобно для конечного пользователя (по крайней мере мне так удобнее).
                0
                Михаил, спасибо, что быстро откликнулись на мою просьбу.
                У нас скрипт интернет-магазина, который использует pear (так уж повелось, скрипт с 2000 годов), который покупают клиенты для установки на сторонние хостинги. В скрипте активно используются pear::db и pear::auth и переписать в сжатые сроки весь скрипт без использования pear не представляется возможным.
                На хостингах уже pear не устанавливают, сейчас срочно стал вопрос ухода с pear.
                Жаль, что здесь используется pdo, на некоторых хостингах оно также не установлено.
                Наверное буду делать модуль на основе Вашей старой версии для php4, но там не все функции pear::db реализованы и nextid создает много лишних временных таблиц, в общем придется допиливать.

                Еще хочу спросить почему у Вас в методе connect так много параметров, они не соответствуют количеству параметров в pear:
                function connect($dsn, $persistent = false)
                  0
                  Connect обычно стоит один раз о всем коде и не проблема его поправить, потому совместимость была прнесена в жертву. Хотя, конечно, никто не мешает перенести часть параметров в конструктор. Потому и предлагал допилить общими усилиями дабы всем нравилось, самому не всегда видны недостатки. Но, походу, благие намерения оборачиваются только потерей кармы :-) надеюсь хоть кому то был полезен.

                Only users with full accounts can post comments. Log in, please.