Проблема доступа к MySQL из ZendFramework может поставить новичка в тупик, так как сообщения об ошибках и отсутствия каких-то там драйверов, далеко не так понятны, если ты еще не успел толком вникнуть в используемые Zend'ом технологии и принципы.
Благо язык PHP полностью документирован и найти ответы не так уж сложно. Не смотря на то, что на первый взгляд, хватило бы просто описания решения, я предпочел бы рассказать, как подобного рода проблемы решить самостоятельно, то есть от момента прочтения сообщения об ошибке, до полностью рабочего кода.
Инструментарий:
— Windows XP Professional (SP2)
— ZendFramework-1.6
— PHP Version 5.2.6
— Сервер: StpServer 1.0
— MySQL 5.0.51b
После написания некоторого кода или копипаста кода туториала с использованием БД, при попытке зайти на страницу где некие данные из базы выводятся в браузер, я получаю ошибку вида:
Первое что приходит в голову посмотреть страницу phpinfo() в поисках возможных причин проблемы, что мы и делаем…
Там в разделе PDO, обнаруживается, что единственный из установленных драйверов PDO, это sqlite2. В нашем же случае, мы хотим использовать MySQL.
Отлично, теперь нам известно о том, что такое PDO и чего собственно не хватает. Но, конечно же, возникает закономерное возмущение в адрес сборки сервера.
Однако, как сообщает официальный сайт PHP, проблема не в дистрибутиве STP:
Остается найти драйвер для mysql.
Как сообщает тот же официальный сайт, файлики должны называться так:
Поскольку ранее мы узнали, что PDB и его драйвера написаны на С в рамках PECL, нам остается зайти на официальный сайт этого сообщества. Далеко ходить на придется, добавим к адресу сайта PHP всего лишь приставку pecl.
На http://pecl.php.net/ забиваем ключевое слово PDO в поиск раздела Packages.
В результатах поиска выбираем самый релевантный пункт и оказываемся на нужной нам странице. Теперь кликаем в таблице версий на номерок последнего стабильного релиза и на открывшейся странице отыскиваем ссылку PDO_MYSQL. Очевидно мы на верном пути.
Однако, не стоит спешить и жать на линк [ Download Latest ], он конечно даст нам скачать последний релиз библиотеки, но… в исходниках. Да-да, вот так хитро устроены страницы PECL.
Что бы добраться до бинарников под Windows нам придется еще раз кликнуть по по первому пункту в таблице версий Available Releases, на этот раз 1.0.2
Вот тут-то в описании пакета Package Information, мы и находим заветную ссылку:
Она то нам и нужна!
После загрузки маленького файлика дело, как говориться, в шляпе. Остается скопировать его в папку PECL нашего PHP. В моем случае это T:\usr\local\Php\PECL\
Последний штрих — прописать дополнение в php.ini в разделе расширений. что бы найти нужное место советую использовать поиск со словом pdo.
В итоге получится такая строка, среди прочих расширений:
ЧТО ВАЖНО, прописывать ее следует после extension=php_pdo.dll, так как PHP загружает эти модули последовательно и если порядок двух строк связанных с PDO перепутать, то вы увидите такое сообщение:
Вот и все премудрости.
После успешной перезагрузки сервера, получаем работающий MySQL в ZendFramework, чего и требовалось достичь.
Не думаю, что это было столь уж сложно, но и не на столько просто, что бы вот так сесть и сразу догадаться. Короче, кто знал — не пинать, кто нет — теперь знаете!
Благо язык PHP полностью документирован и найти ответы не так уж сложно. Не смотря на то, что на первый взгляд, хватило бы просто описания решения, я предпочел бы рассказать, как подобного рода проблемы решить самостоятельно, то есть от момента прочтения сообщения об ошибке, до полностью рабочего кода.
Инструментарий:
— Windows XP Professional (SP2)
— ZendFramework-1.6
— PHP Version 5.2.6
— Сервер: StpServer 1.0
— MySQL 5.0.51b
После написания некоторого кода или копипаста кода туториала с использованием БД, при попытке зайти на страницу где некие данные из базы выводятся в браузер, я получаю ошибку вида:
Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' with message 'The mysql driver is not currently installed' in T:\home\virtual\zend\library\Zend\Db\Adapter\Pdo\Abstract.php:103 Stack trace: #0 T:\home\virtual\zend\library\Zend\Db\Adapter\Abstract.php(389): Zend_Db_Adapter_Pdo_Abstract->_connect() #1…
Первое что приходит в голову посмотреть страницу phpinfo() в поисках возможных причин проблемы, что мы и делаем…
Там в разделе PDO, обнаруживается, что единственный из установленных драйверов PDO, это sqlite2. В нашем же случае, мы хотим использовать MySQL.
Note: PDO (PHP Data Objects) — расширение для языка PHP, позволяющее разработчику иметь простой и удобный интерфейс для доступа к базам данных из PHP скриптов.
PDO предоставляет абстрактный доступ к базам данных, это означает, что не важно какую СУБД вы используете, в любом случае вы используете стандартные методы PDO для получения данных и для их записи в базу.
PDO входит в PHP версии 5.1, и доступно как расширение из PECL для PHP 5.0; PDO использует новые OO функции ядра PHP 5 и не работает с PHP более ранних версий.
Материал из Википедии свободной энциклопедии
Отлично, теперь нам известно о том, что такое PDO и чего собственно не хватает. Но, конечно же, возникает закономерное возмущение в адрес сборки сервера.
Однако, как сообщает официальный сайт PHP, проблема не в дистрибутиве STP:
If you're running a PHP 5.1 release, PDO and PDO_SQLITE is included in the distribution; it will be automatically enabled when you run configure.
Остается найти драйвер для mysql.
Как сообщает тот же официальный сайт, файлики должны называться так:
extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
Поскольку ранее мы узнали, что PDB и его драйвера написаны на С в рамках PECL, нам остается зайти на официальный сайт этого сообщества. Далеко ходить на придется, добавим к адресу сайта PHP всего лишь приставку pecl.
На http://pecl.php.net/ забиваем ключевое слово PDO в поиск раздела Packages.
В результатах поиска выбираем самый релевантный пункт и оказываемся на нужной нам странице. Теперь кликаем в таблице версий на номерок последнего стабильного релиза и на открывшейся странице отыскиваем ссылку PDO_MYSQL. Очевидно мы на верном пути.
Однако, не стоит спешить и жать на линк [ Download Latest ], он конечно даст нам скачать последний релиз библиотеки, но… в исходниках. Да-да, вот так хитро устроены страницы PECL.
Что бы добраться до бинарников под Windows нам придется еще раз кликнуть по по первому пункту в таблице версий Available Releases, на этот раз 1.0.2
Вот тут-то в описании пакета Package Information, мы и находим заветную ссылку:
Windows binaries can be found at http://pecl4win.php.net/ext.php/php_pdo_mysql.dll
Она то нам и нужна!
После загрузки маленького файлика дело, как говориться, в шляпе. Остается скопировать его в папку PECL нашего PHP. В моем случае это T:\usr\local\Php\PECL\
Последний штрих — прописать дополнение в php.ini в разделе расширений. что бы найти нужное место советую использовать поиск со словом pdo.
В итоге получится такая строка, среди прочих расширений:
;extension=php_msql.dll
extension=php_mysql.dll
extension=php_mysqli.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
;extension=php_oracle.dll
;extension=php_pdf.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll
;extension=php_pgsql.dll
;extension=php_printer.dll
ЧТО ВАЖНО, прописывать ее следует после extension=php_pdo.dll, так как PHP загружает эти модули последовательно и если порядок двух строк связанных с PDO перепутать, то вы увидите такое сообщение:
Warning!
PHP Startup: Unable to load dynamic library '/usr/local/PHP/PECL\php_pdo_mysql.dll' — Не найден указанный модуль.
Вот и все премудрости.
После успешной перезагрузки сервера, получаем работающий MySQL в ZendFramework, чего и требовалось достичь.
Не думаю, что это было столь уж сложно, но и не на столько просто, что бы вот так сесть и сразу догадаться. Короче, кто знал — не пинать, кто нет — теперь знаете!