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


292

Я только что установил 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 Server).

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

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


21
Посмотрите в вашем php.ini' file and uncomment расширении = php_pdo_mysql.dll . The path to your php.ini` файл можно найти, посмотрев на ваш phpinfo ().
Styfle

3
К вашему сведению для будущих читателей, если вы получите эту ошибку и GoDaddy ваш хост, войдите в свою учетную запись администратора. Детали хостинга-> Языки программирования. Обновите версию PHP до последней версии или хотя бы 5,4
Джо

@Joe Я обновил, но все еще получаю ошибку (GoDaddy)
Eugen Sunic

@styfle 1up, на Linux-машине я установил extension=msql.soи все работает!
AjayKumarBasuthkar

Для кого это может касаться: если вы используете php 7.1+ в докере, вы можете docker execвойти в контейнер и запустить docker-php-ext-install pdo pdo_mysql.
Cleybertandre

Ответы:


240

Вам нужен модуль с именем pdo_mysql. Ищете следующий в phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

2
@ZZ Coder Этого нет в phpinfo (). Вы знаете, как я могу установить pdo_mysql?
Майк Мур

14
@letseatfood ... Как ты это понял? У меня такая же проблема!
Христо

17
Я могу порекомендовать пакет Ubuntu "php5-mysql" для установки поддержки PDO для MySQL
Том Карвер

3
Обратите внимание, что для тех, кто использует Apache или другой веб-сервер, необходимо перезапустить Apache, чтобы изменения вступили в силу:sudo systemctl restart httpd.service
Mugoma J. Okomba

50
Для Ubuntu 16.04 и PHP7 используйтеsudo apt-get install php-mysql
Иван Марьянович

199

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

3
ааа ... перезагрузка это то, что укусило меня!
KOGI

У меня была та же проблема, убедитесь, что вы перезапустите php5-fpm!
Eko3alpha

Потратил почти всю ночь, пытаясь взломать это, пока я не увидел ваш ответ. Все сделал правильно, но забыл перезапустить apache.
Мугома Дж. Окомба

php-mysql уже самая новая версия (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). При попытке запустить команду sudo apt-get установите php-mysql в Ubuntu 16.04 с nginx php fpm, я также перезапускаю php fpm, а затем перезапускаю nginx.
Прашант

В настоящее время это php-mysql и php7.1-mysql. Надеюсь, что это модель движется вперед.
Джон П

83

Обновление : более новые версии должны использовать 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), вам просто нужно запустить строки выше, и тогда вы будете в порядке.


57
Почему вы дали инструкции для sqlite, когда OP использует MySQL?
Эндрю Энсли

7
@ Andrew, если вы используете pdo_sqliteи не устанавливаете, php5-sqliteвы получаете только PDOExceptionбез информации об отсутствующем sqlite и попробуйте установить php5-mysqlдважды.
Aitch

2
Обратите внимание, что php5-sqlite устарел и может быть недоступен для вашей системы, то есть Ubuntu 16.04. Вместо этого установите php-sqlite3.
Матиас

2
@briankip Конечно, если вы пытаетесь подключиться к SQLite, и этот драйвер отсутствует. Но ОП пытается подключиться к MySQL. Установка sqlite могла / не могла решить его проблему.
Эндрю Энсли

2
@AndrewEnsley. Заголовок этой страницы является ошибкой, которую получают все, независимо от их платформы БД. В результате, эта страница имеет самый высокий рейтинг в Google, если вы просто погуглили ошибку. Поэтому, IMO, любой ответ на этот вопрос, относящийся к другим базам данных, должен приветствоваться здесь. Если они не работают на ФП, пусть будет так ... ФП не должен принимать эти ответы. Это не означает, что этот ответ не является «полезным» для других, исследующих сообщение об ошибке в заголовке, которое подарило этот вопрос поисковому рангу Золтара. +1
elrobis

34

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

sudo apt-get install php-mysql

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

sudo service apache2 restart

Я думаю, что в наши дни вы должны быть конкретны с версией sudo apt-get install php7.2-mysql
Стэн Соколов

25

Я была такая же проблема. Решение зависит от ОС. В моем случае у меня есть 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

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


Как и в сторону для тех , кто , как я нашел , что это не вполне хватает , и не хотят , чтобы пройти через шаги , чтобы полностью удалить php5 перед тем проверив , что php7 будет работать: a2dismod php5, a2enmod php7.0и , service apache2 restartнаконец , получил меня обратно и работает.
depwl9992

21

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

extension_dir = "c:\php5\ext"


2
Я только что подтвердил, что это правда (Win2008). Странно - другие расширения работают только с рекомендованнымextension_dir = "ext" , но не с этим.
скипилот

тоже самое. добавил путь и начал работать. Windows10, php7.1
Крис Гибб

14

На Ubuntu просто выполнить

sudo apt-get install php5-mysql

1
Я был за Symfony2 и Ubuntu. Pdo_mysql не найден ([PDOException] не удалось найти драйвер). Это решило проблему.
Райнхард

2
Для меня мне не хватало Postgresql, так что это закончилось так:sudo apt-get install php5-pgsql
Kzqai

@Kzqai 2:30 утра, и вы только что решили мою проблему, я не использовал mysql, я использовал postgres (> ლ)
Dheeraj

9
sudo apt-get install php-mysql 

хорошо работал на Ubuntu и PHP 7


Это сработало для меня, хотя я не использую php7, но php5.6. Но у меня есть 7 установленных. Я установил 5.6 позже и переключился на это без удаления php7
Мубашар Аббас

9

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

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

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


6

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

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll

2
начиная с PHP v5.3, php_pdo.dllмодуль больше не требуется (не существует). php.net/manual/en/pdo.installation.php , вероятно, является окончательным ответом на этот вопрос.
Мартин Цейтлер

5

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


2
Я смотрю в php.ini, но что мне искать? Я вижу раздел, который начинается с[MySQL]
Майк Мур

4

Для 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.



3

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

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


3

Я провел последний день, пытаясь выяснить, почему я получаю следующую ошибку. Я использую 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, поскольку он не поставляется с ним по умолчанию.


2

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


2

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


2

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

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

Обратите внимание: именно в этом порядке


2

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

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

sudo apt-get install php5-mysqlnd

1

Я исправил эту проблему на своем Debian 6. Обычно я только что установил php5-commonпакет. После установки вам необходимо перезапустить ваш веб-сервер (apache или nginx в зависимости от того, какой вы установили). Затем я просто делаю lsofв apache процесс id ( 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/


php-mysql уже самая новая версия (1: 7.1 + 49 + deb.sury.org ~ xenial + 4).
Прашант

1
$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

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


1
без водителя этот пользователь все равно получит то же исключение
eggmatters

1

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

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

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

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

2) $ sudo apt-get установить php7.0-mysql

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

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


1

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

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

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

$dbh = new PDO ("dblib ...

1

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

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

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

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


1

Для тех, кто использует 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


1

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

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


1

Некорректная установка 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 Location = 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

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



1
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 '{}' \;

0

У меня было то же исключение при попытке использовать 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.