PDOException «не удалось найти драйвер»

Я только что установил Debian Lenny с Apache, MySQL и PHP и получаю исключение PDOException could not find driver.

Это конкретная строка кода, о которой идет речь:

$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS)

DB_HOST, DB_NAME, DB_USER и DB_PASS - константы, которые я определил. Он отлично работает на производственном сервере (и на моей предыдущей настройке сервера Ubuntu).

Это как-то связано с моей установкой PHP?

Поиск в Интернете не помог, все, что я получаю, - это обмен экспертами и примерами, но никаких решений.


person Mike Moore    schedule 17.05.2010    source источник
comment
Загляните в свой php.ini' file and uncomment extension = php_pdo_mysql.dll. The path to your php.ini` файл, который можно найти, посмотрев на ваш phpinfo ().   -  person styfle    schedule 27.01.2012
comment
К сведению будущих читателей, если вы получите эту ошибку и GoDaddy является вашим хостом, войдите в свою учетную запись администратора. Детали хостинга- ›Языки программирования. Обновите свою версию PHP до последней или не ниже 5.4.   -  person Joe    schedule 22.06.2014
comment
@Joe Я обновился, но все равно получаю сообщение об ошибке (GoDaddy)   -  person Eugen Sunic    schedule 19.10.2015
comment
@styfle 1up, На машине Linux ставил extension=msql.so и работает!   -  person AjayKumarBasuthkar    schedule 17.10.2018
comment
Кому это может быть интересно: если вы используете php 7.1+ в докере, вы можете docker exec в контейнер и запустить docker-php-ext-install pdo pdo_mysql.   -  person cleybertandre    schedule 09.06.2019
comment
Можно, но нельзя. Внесенные таким образом изменения существуют только в эфемерном временном контейнере и легко теряются при перезапусках, перестроениях и обновлениях. Вместо этого вы должны добавить строку в свой Dockerfile, чтобы убедиться, что она станет постоянной частью образа Docker.   -  person Torque    schedule 12.09.2019


Ответы (39)


Вам нужен модуль под названием pdo_mysql. Ищу подписчиков в phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44
person ZZ Coder    schedule 17.05.2010
comment
@Hristo Я думаю, что модуль pdo_mysql не входил в состав пакета по умолчанию в Debian Lenny - person Mike Moore; 14.06.2010
comment
Я могу порекомендовать пакет Ubuntu php5-mysql для установки поддержки PDO для MySQL. - person Tom Carver; 30.09.2013
comment
Обратите внимание, что тем, кто использует Apache или другой веб-сервер, необходимо перезапустить Apache, чтобы изменения вступили в силу: sudo systemctl restart httpd.service - person Mugoma J. Okomba; 31.08.2016
comment
Для Ubuntu 16.04 и PHP7 используйте sudo apt-get install php-mysql - person Ivan Marjanovic; 13.10.2016
comment
Из интерфейса командной строки вы можете проверить свою установку: php -i | grep pdo_mysql - person krisanalfa; 23.05.2018
comment
возможно, вам придется использовать команду командной строки php7 вместо php - person dagelf; 31.05.2018
comment
использование предложения @IvanMarjanovic сработало для меня с использованием WSL Ubuntu 20.04 php 7.4 - person Stetzon; 17.12.2020
comment
Установка зависит от используемой вами версии php. Для 5.6 используйте sudo apt install php5.6-mysql - person Wolfgang Blessen; 16.02.2021
comment
Здравствуйте, у меня есть раскомментированный файл в ini-файле, но он все еще выдает эту ошибку, что может быть причиной этого? - person MareksNo; 13.06.2021

Dsn в вашем коде показывает, что вы пытаетесь подключиться к драйверу mysql. Ваше сообщение об ошибке указывает, что этот драйвер недоступен.

Убедитесь, что на вашем сервере установлено расширение mysql.

В Ubuntu / Debian вы проверяете наличие пакета с помощью:

dpkg --get-selections | grep php | grep mysql

Установите пакет php5-mysql, если у вас его нет.

В Ubuntu / Debian вы можете использовать:

  • PHP5: sudo apt-get install php5-mysql
  • PHP7: sudo apt-get install php7.0-mysql

Наконец, чтобы он заработал, вам необходимо перезапустить веб-сервер:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart
person ghbarratt    schedule 10.11.2011
comment
php-mysql - это уже самая новая версия (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). При попытке запустить команду sudo apt-get install php-mysql в ubuntu 16.04 с nginx php fpm я также перезапускаю php fpm, а затем перезапускаю nginx. - person Prashant Barve; 12.01.2017
comment
В настоящее время это php-mysql и php7.1-mysql. Надеюсь, эта модель движется вперед. - person John P; 12.03.2018

Обновление: в более новых версиях следует использовать пакет php-sqlite3 вместо php5-sqlite. Так что используйте это, если вы используете последнюю версию ubuntu:

sudo apt-get install sqlite php-sqlite3

Оригинальный ответ на вопрос здесь:

sudo apt-get install sqlite php5-sqlite
sudo /etc/init.d/apache2 restart

Если ваш phpinfo () не отображает строку pdo_sqlite (в моем случае, на моем сервере Ubuntu), вам просто нужно запустить строки выше, и тогда все будет в порядке.

person Sudipta Chatterjee    schedule 27.08.2010
comment
Нужна только первая строка. - person mattalxndr; 16.02.2012
comment
Почему вы дали инструкции для sqlite, когда OP использует MySQL? - person Andrew Ensley; 21.09.2012
comment
@Andrew, если вы используете pdo_sqlite и не установили php5-sqlite, вы получите только PDOException без информации об отсутствующем sqlite и попытаетесь установить php5-mysql дважды. - person Aitch; 10.02.2015
comment
Обратите внимание, что php5-sqlite устарел и может быть больше не доступен для вашей системы, например Ubuntu 16.04. Вместо этого установите php-sqlite3. - person Matthias; 22.10.2016
comment
Я использую php 7.1 и nginx, как установить для php 7.1, я запускаю команду sudo apt install php-mysql, и она устанавливает пакет, но по-прежнему возникает та же проблема. - person Prashant Barve; 12.01.2017
comment
@briankip Конечно, если вы пытаетесь подключиться к SQLite и этот драйвер отсутствует. Но OP пытается подключиться к MySQL. Установка sqlite не могла решить его проблему. - person Andrew Ensley; 03.03.2017
comment
@AndrewEnsley. Заголовок этой страницы - это сообщение об ошибке, которое возникает у всех, независимо от их платформы БД. В результате эта страница имеет САМЫЙ наивысший рейтинг в поиске Google, если вы погуглите только ошибку. Поэтому, ИМО, здесь следует приветствовать любой ответ на этот вопрос, относящийся к другим базам данных. Если они не работают для OP, пусть будет так ... OP не должен принимать эти ответы. Это не значит, что этот ответ бесполезен для других, исследующих сообщение об ошибке в заголовке, который дал этому вопросу рейтинг поиска Zoltar. +1 - person elrobis; 05.03.2019

Для более новых версий Ubuntu с PHP 7.0 вы можете получить пакет php-mysql:

sudo apt-get install php-mysql

Затем перезапустите свой сервер:

sudo service apache2 restart
person ThomasAFink    schedule 19.08.2016
comment
Я думаю, что в настоящее время вы должны быть конкретными с версией sudo apt-get install php7.2-mysql - person Stan Sokolov; 24.10.2019

Я была такая же проблема. Решение зависит от ОС. В моем случае у меня есть debian, поэтому для его решения:

  • Моя версия php обновлена ​​с (php5 до php7)
  • Установите php-mysql и php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
    
  • Я отредактировал свой php.ini файл в /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
    
  • Затем перезапустите apache:

    service apache2 restart
    

Это решает мою проблему

person onlyme    schedule 05.06.2017
comment
В качестве отступления для тех, кто, как я, обнаружил, что этого недостаточно и не хочет выполнять шаги, чтобы полностью удалить php5, прежде чем проверять, что php7 будет работать: a2dismod php5, a2enmod php7.0 и service apache2 restart наконец-то вернули меня к работе. - person depwl9992; 13.11.2017

На моей машине с Windows мне пришлось указать абсолютный путь к каталогу расширений в моем php.ini:

extension_dir = "c:\php5\ext"

person berdzi    schedule 10.06.2013
comment
Я только что подтвердил, что это правда (Win2008). Странно - другие расширения работают только с рекомендованным extension_dir = "ext", но не с этим. - person scipilot; 09.07.2014
comment
то же самое. добавил путь и начал работать. Windows10, php7.1 - person Chris Gibb; 26.11.2017

В Ubuntu просто выполните

sudo apt-get install php5-mysql
person Dmitry Sobolev    schedule 16.04.2013
comment
Я стоял за Symfony2 и Ubuntu. Pdo_mysql не найден ([PDOException] не удалось найти драйвер). Это решило проблему. - person Reinherd; 01.08.2013
comment
Для меня мне не хватало Postgresql, поэтому в итоге получилось: sudo apt-get install php5-pgsql - person Kzqai; 20.05.2016

Проверьте, доступен ли модуль с php -m | grep pdo_mysql.

Если нет, для PHP 7.2 вы можете установить соответствующий пакет с sudo apt install php7.2-mysql.

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

person Pratik    schedule 04.07.2019

sudo apt-get install php-mysql 

хорошо работал на ubuntu и php 7

person Moses Nandwa    schedule 12.05.2016
comment
У меня это сработало, хотя я использую не php7, а php5.6. Но у меня установлено 7. Я установил 5.6 позже и переключился на него, не удаляя php7. - person Mubashar Abbas; 22.07.2016

При добавлении их в ваш php.ini убедитесь, что ссылка php_pdo.dll находится вначале перед db-библиотеками драйверов db, иначе это также вызовет это сообщение об ошибке. Добавьте их так:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
person Paul Foster    schedule 17.11.2014
comment
начиная с PHP v5.3 модуль php_pdo.dll больше не требуется (не существует). php.net/manual/en/pdo.installation.php, вероятно, окончательный ответ на этот вопрос. - person Martin Zeitler; 13.11.2015

Проверяли ли вы свой php.ini (проверьте правильность расположения с помощью phpinfo ()), правильно ли установлены MySQL и драйвер?

person cem    schedule 17.05.2010
comment
Я ищу в php.ini, но что мне искать? Я вижу раздел, который начинается с [MySQL] - person Mike Moore; 18.05.2010

Для PHP 5.5 на CentOS я исправил это, установив пакет php55-mysqlnd.

sudo yum -y install php55w-mysqlnd # For Webtatic
sudo yum -y install php55u-mysqlnd # For Remi

Чтобы получить помощь по установке, напишите комментарий, поскольку это зависит от способа установки PHP в вашей системе. Доступные репо: webtatic и remi.

person SimonW    schedule 23.07.2014

для Windows 8.1 / 10 в файле: \\ php.ini раскомментируйте строку «extension = pdo_mysql»

person Egor Doynikov    schedule 19.12.2017

Проверьте правильность установки extension_dir в файле конфигурации php. Попробуйте прокомментировать / раскомментировать некоторые расширения и посмотреть, отражается ли это на phpinfo (). Если это не так, то либо файл конфигурации php не может быть загружен (неправильное расположение) extension_dir прокомментирован или установлен в неправильное расположение.

person hserge    schedule 18.08.2012

В моем случае моя строка DSN была неправильной, в частности, она не содержала mysql://., я ожидал другого сообщения об ошибке, возможно, что-то вроде «строка DSN не указывает драйвер / протокол».

Добавление mysql:// в начало строки DSN решило проблему.

person gposton    schedule 21.06.2012

У меня была такая же проблема при запуске тестов с отдельным php.ini. Мне пришлось добавить эти строки в свой собственный файл php.ini:

[PHP]
extension = mysqlnd.so
extension = pdo.so
extension = pdo_mysql.so

Примечание: именно в этом порядке

person Facedown    schedule 23.07.2016

Я потратил последний день, пытаясь выяснить, почему я получаю следующую ошибку. Я использую Ubuntu 14.04.

Проблема:
Я заметил, что моя версия PHP-CLI работала под php7.0, но php_info () (веб-версия) отображала php 5.5.9. Несмотря на то, что php_info () сказал, что pdo включен, использование командной строки (CLI) не распознает команду pdo_mysql. Оказалось, что mysql был включен для моей старой версии, но не для версии CLI. Все, что я сделал, это установил mysql для php7.0, и он заработал.

Вот что сработало:

Чтобы проверить версию:

php -v

Чтобы установить mysql для php7.0

sudo apt-get install php7.0-mysql

1) убедитесь, что ваша версия CLI такая же, как и ваша веб-версия
2) Если они разные, убедитесь, что в вашей версии CLI есть подключаемый модуль mysql, поскольку он не поставляется с ним по умолчанию.

person Growling Flea    schedule 04.01.2017

Проблема заключается в отсутствии библиотеки php to mysql. В CentOs я исправил это, запустив # yum install php-mysql, а затем перезапустив apache с # /bin/systemctl restart httpd.service. Обратите внимание, что именование немного отличается от дистрибутивов на основе debian / ubuntu, php-> php5 и httpd-> apache2.

person Japheth Ongeri - inkalimeva    schedule 08.12.2015

Я настоятельно рекомендую mysqllnd вместо mysql, потому что у вас будет много проблем, таких как преобразование чисел, а тип битов оценивает проблему с расширением mysql.

в ubuntu установите mysqllnd с помощью следующей команды:

sudo apt-get install php5-mysqlnd
person MSS    schedule 17.09.2016

Вызывалась неправильная установка PHP

У меня была такая же проблема. И я надеюсь, что это поможет кому-то, у кого такая же проблема, как у меня.

Сценарий

OS = Windows 10  
Platform = XAMPP  
PHP Version = 7 (Multiple Version seem to have been installed in the PC)  

Я создал phpinfo.php файл в папке public и запустил phpinfo(), чтобы найти местоположение моего php.ini файла.

Расположение PHP.ini = c:\xampp\php\php.ini

Проблема
При вызове c:\xampp\htdocs> php -v возвращено PHP 7.2.3, но phpinfo.php показало PHP 7.2.2.

Решение
Вместо звонка

php artisan migrate:install   

который дал мне эту ошибку, я использовал

c:\xampp\php\php artisan migrate:install

и это сработало.

person RealSollyM    schedule 21.09.2018

Я исправил эту проблему на моем Debian 6. Обычно я просто устанавливал php5-common пакет. После установки вам необходимо перезагрузить веб-сервер (apache или nginx в зависимости от того, какой из них вы установили). Затем я просто выполняю lsof для идентификатора процесса apache (lsof -p process_id) следующим образом:

sudo lsof -p 1399   #replace 1399 by your apache process id
apache2 1399 root  mem    REG  254,2    80352 227236 /usr/lib/php5/20090626/xmlrpc.so
apache2 1399 root  mem    REG  254,2   166496 227235 /usr/lib/php5/20090626/suhosin.so
apache2 1399 root  mem    REG  254,2    31120 227233 /usr/lib/php5/20090626/pdo_mysql.so
apache2 1399 root  mem    REG  254,2   100776 227216 /usr/lib/php5/20090626/pdo.so
apache2 1399 root  mem    REG  254,2   135864 227232 /usr/lib/php5/20090626/mysqli.so

Как вы можете видеть выше, модули устанавливаются по пути к файлу, который неизвестен или руководствуется общим путем библиотеки: / usr/lib/php5/20090626/. Для вашей установки он может быть другим, но только путь к pdo_mysql.so, pdo.so, mysqli.so. Вот почему Drupal или любой другой движок php не может найти библиотеку и показывает эту ошибку: PDOException: could not find driver

Я просто не знаю, почему он установлен по такому странному пути, для меня это просто ошибка в скрипте установки пакета библиотеки в debian 6. Я решил проблему, создав символический символ для всех файлов от /usr/lib/php5/20090626/ до /usr/lib/php5/ с этим команда:

ln -s /usr/lib/php5/20090626/* /usr/lib/php5/

person douggynix    schedule 08.11.2012
comment
php-mysql - это уже самая новая версия (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). - person Prashant Barve; 12.01.2017

$DB_TYPE = 'mysql'; //Type of database<br>
$DB_HOST = 'localhost'; //Host name<br>
$DB_USER = 'root'; //Host Username<br>
$DB_PASS = ''; //Host Password<br>
$DB_NAME = 'database_name'; //Database name<br><br>

$dbh = new PDO("$DB_TYPE:host=$DB_HOST; dbname=$DB_NAME;", $DB_USER, $DB_PASS); // PDO Connection

Это сработало для меня.

person Persianuser    schedule 03.06.2013
comment
без драйвера этот пользователь все равно получит то же исключение - person eggmatters; 02.08.2014

Я столкнулся с той же проблемой после того, как удалил пакет php5 (который также включает в себя все драйверы), чтобы установить пакет php7. Я фактически установил пакет php7 без модуля mysql.

Мне удалось решить эту проблему, набрав в терминале:

1) $ apt-cache search php7, в котором перечислены все модули, просматривая найденные мной модули,

php7.0-mysql - модуль MySQL для PHP

2) $ sudo apt-get install php7.0-mysql

Вот и все. У меня это сработало в моей системе Linux.

(используйте соответствующую версию php, ваша может быть php5)

person Roshimon    schedule 10.05.2016

Еще одна вещь, которую нужно подтвердить, поскольку некоторые люди для начала копируют / вставляют пример кода из Интернета. Убедитесь, что вы ввели здесь MySQL:

... $dbh = new PDO ("mysql: ...  

В некоторых примерах это показывает

$dbh = new PDO ("dblib ...
person Joe    schedule 29.06.2016

В моем случае я использовал PDO с php-cli, и он работал нормально.

Только когда я попытался подключиться через apache, у меня возникла проблема с «отсутствующим драйвером», которую я не совсем понял.

Простой apt-get install php-mysql решил это. (Ubuntu 16.04 / PHP7. Кредиты переходят к выбранному ответу и комментарию Ивана)

Надеюсь, это поможет.

person Balmipour    schedule 31.10.2016

Для тех, кто использует Symfony2 / 3 и задается вопросом, почему вы получаете эту ошибку. Если вы используете "mapping_types", вы можете столкнуться с этой ошибкой. Причина в том, что "mapping_types" размещен на неправильном уровне. Например :

doctrine:
  dbal:
    mapping_types:
        set: string

Этот "mapping_types" должен быть размещен на этом уровне:

doctrine:
dbal:
    #To counter the error caused by 'mapping_types'
    connections:
        default:
            server_version: %database_server_version%
            mapping_types:
                set: string

надеюсь, это поможет

Я нашел решение здесь: https://github.com/doctrine/DoctrineBundle/issues/327 < / а>

person aneth101    schedule 17.02.2017

Куда бы я ни пошел, я читал, что путь extension_dir должен быть изменен с ext на абсолютный путь. У меня это сработало. Однако при попытке собрать сервер на ПК моего коллеги мне пришлось присвоить значение ext вместо того, чтобы указывать абсолютный путь.

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

person papillon    schedule 13.02.2018

Проверьте правильный путь в extension_dir в вашем phpinfo ().

person Alexandr Nizhnik    schedule 29.05.2019

Была такая же проблема, потому что я забыл зайти в свою виртуальную машину. Если я перейду в свой локальный каталог вот так:

cd /www/homestead/my_project
php artisan migrate

эта ошибка появится. Но он работает на моей виртуальной машине

cd ~/homestead
vagrant ssh   
cd /www/homestead/my_project
php artisan migrate
person Adam    schedule 21.06.2019

PHP Fatal error:  Uncaught PDOException: could not find driver

Я боролся и боролся с "apt install php-mysql php7toInfinity и не забывайте sqlite-what-ever's" и просто не мог избавиться от этого сообщения об ошибке, пока я не вернулся к основам и не сбросил права доступа к файлам на веб-сайте обсуждаемый.

Эти 3 команды сбрасывают права доступа к файлам и папкам на веб-сайте и заставляют его снова работать.

cd /var/www/web-site-name.com/web/

# find (sub) directories and change permissions
find . -type d -exec chmod 755 {} \;

# find files and change permissions
find . -type f -exec chmod 664 '{}' \;
person SamTzu    schedule 18.08.2019

У меня было такое же исключение при попытке использовать pdo_sqlite. Проблема заключалась в том, что автоматически созданные 20-pdo_sqlite.ini и 20-sqlite3.ini символические ссылки (в /etc/php5/mods-enabled) были сломаны.

Удаление неработающих символических ссылок и добавление их вручную с помощью:

  • sudo ln -s /etc/php5/mods-avaliable/pdo_sqlite.ini /etc/php5/mods-enabled/20-pdo_sqlite.ini
  • sudo ln -s /etc/php5/mods-avaliable/sqlite3.ini /etc/php5/mods-enabled/20-sqlite3.ini

исправил проблему.

Примечание: это не сработает для более старых версий php, поскольку они не искали конфигурации в /etc/php5/mods-enabled

person ioleo    schedule 05.09.2014

Если вы используете sqlite для тестирования, вам понадобится php sqlite pdo drive. Вы можете установить их, как показано ниже.

Для Ubuntu 14.04

sudo apt-get install php5-sqlite
sudo service apache2 restart

В ubuntu 16.04 нет php5-sqlite

sudo apt-get install php7.0-sqlite
sudo service apache2 restart
person Web Developer in Pune    schedule 19.10.2016

Для Linux Mint

У меня была такая же проблема при использовании PhpBrew (5.5.9 / 7.0.14) и попытке создать соединение PDO.

После того, как я попробовал большинство решений в этом посте, я сделал следующее:

  1. Работает с PhpBrew

  2. Выполнено sudo apt-get install php7.0 (Linux Mint 17.2 / PHP7.0.16) - установлена ​​свежая версия php

person Andrei .K    schedule 28.02.2017

Если вы прочитали весь ответ выше, и он по-прежнему не работает ...

Убедитесь, что ваша строка подключения PHP PDO в порядке. Не как у меня:

$dbh = new PDO('"mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS)

В сообщении об ошибке нет информации о том, какой драйвер не был найден.

После переустановки всех возможных библиотек PDO и MySQL я обнаружил, что в начале моей строки подключения стоит ".

person JerzySBG    schedule 19.10.2018

Удалите точку с запятой перед ; extension = php_pdo_mysql.dll в php.ini и сохраните. Не забудьте перезапустить xampp Apache и Mysql.

person Teoman Diler    schedule 07.02.2016

Решение для меня заключалось в установке php, не правильно настроили переменную среды и файл php.ini. Выполняя эти два исправления, мы получаем некомментированную линию extension = pdo_mysql.so.

person Brandon Emanual Almeida    schedule 19.08.2020

Была такая же проблема, и я только что понял, что веб-сайт работает под MAMP php, но когда вы вызываете команду, он запускает Mac (если путь bash не изменен). у вас возникнет проблема, если у Mac нет этих расширений.

запустите php -i, чтобы узнать загруженные расширения, и установите те, которые вы пропустили. или запустите '/Applications/MAMP/bin/php/php5.3.6/bin/php artisan {your command}', чтобы использовать MAMP

person Entrust    schedule 02.04.2015

Я решил эту проблему, включив php_pdo_mysql.ddl в «Информационная служба IIS -> Расширение PHP».

person Riccardo Compagnone    schedule 27.04.2015

В моем случае (Windows XP + Apache2.2 + PHP 5.4.31) я изменил PHPIniDir в httpd.conf, чтобы обойти эту проблему:

из:

"C:\php5\" 

to:

"C:/php5/"
person Anton    schedule 27.05.2015