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).

Це щось стосується моєї установки PHP?

Пошук в Інтернеті не допоміг, все, що я отримую, - це обмін експертами та приклади, але рішення немає.


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

3
FYI будь-яким майбутнім читачам, якщо ви отримаєте цю помилку, а 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 та PHP7sudo 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

Провів майже цілу ніч, намагаючись зламати це, поки я не побачив вашої відповіді. Зробив все правильно, але забув перезапустити апаш.
Mugoma J. Okomba

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.
Прашант Барве

В даний час, схоже, це 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, коли ОП використовує 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 Назва цієї сторінки - це помилка, яку отримують усі незалежно від платформи db. Як результат, ця сторінка має найвищий рейтинг пошуку в Google, якщо ви лише помилка в Google. Тому ІМО, будь-яка відповідь на це питання, що стосується інших баз даних, тут слід вітати. Якщо вони не працюють для ОП, так і нехай ... ОП не повинні приймати ці відповіді. Це не означає, що ця відповідь не є "корисною" для інших, хто досліджує повідомлення про помилку в заголовку, яке надало це питання рейтингу пошуку Золтара. +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 я повинен був дати абсолютний шлях до dir-розширення в моєму 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] не вдалося знайти драйвер). Це вирішило питання.
Reinherd

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 є першим перед тим, як драйвери db закриються, інакше це також спричинить це повідомлення про помилку. Додайте їх так:

[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 у бібліотеці 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
без драйвера цей користувач все одно отримає той самий виняток
яєчники

1

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


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/isissue/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 Розташування = 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" і просто не міг позбутися цього повідомлення про помилку, поки я не повернувся до основ і не скинув дозволи на файли на веб-сайті розглянутий.

Ці 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.