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?

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

Ответ 1

Вам нужен модуль pdo_mysql. Поиск следующего в phpinfo(),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

Ответ 2

В вашем коде 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

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

Ответ 4

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

sudo apt-get install php-mysql

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

sudo service apache2 restart

Ответ 5

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

extension_dir = "c:\php5\ext"

Ответ 6

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

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

Ответ 7

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

sudo apt-get install php5-mysql

Ответ 8

sudo apt-get install php-mysql 

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

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

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

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

на ubuntu install mysqllnd со следующей командой:

sudo apt-get install php5-mysqlnd

Ответ 19

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

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

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

Ответ 20

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

Ответ 21

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

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

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

$dbh = new PDO ("dblib ...

Ответ 22

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

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

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

Ответ 23

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

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

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

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

Ответ 24

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

Ответ 25

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

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

Ответ 26

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

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

Ответ 27

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

Ответ 28

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

Ответ 29

$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

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

Ответ 30

У меня было то же исключение при попытке использовать 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, поскольку они не искали configs в /etc/php5/mods-enabled