Проблема доступа к MySQL из ZendFramework может поставить новичка втупик, так как сообщения об ошибках и отсутствия каких-то тамдрайверов, далеко не так понятны, если ты еще не успел толком вникнутьв используемые Zend'ом технологии и принципы.
Благо PHP языкполностью документированный и найти ответы не так уж сложно. И несмотря на то, что на первый взгляд, хватило бы просто описания решения,я предпочел бы рассказать, как подобного рода проблемы решитьсамостоятельно, то есть от момента прочтения сообщения об ошибке, дополностью рабочего кода.
Итка, поехали...
Инструментарий:
- ZendFramework-1.5.3 (последняя на момент написания поста stable версия)
- PHP Version 5.2.6
- Сервер: StpServer 1.0
- MySQL 5.0.51b
Посленаписания некторого кода или копипаста кода туториала с использованиемБД, при попытке зайти на страницу где некие данные из базы выводятся вбраузер, я получаю ошибку вида:
Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' withmessage 'The mysql driver is not currently installed' inT:\home\virtual\zend\library\Zend\Db\Adapter\Pdo\Abstract.php:103 Stacktrace: #0T:\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 inthe distribution; it will be automatically enabled when you runconfigure.
Остается найти драйвер для 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, чего и требовалось достичь.
Недумаю, что это было столь уж сложно, но и не на столько просто, что бывот так сеть и сразу догадаться. Короче кто знал - не пинать, кто нет -теперь знаете!