Ответ 1
Вам нужен модуль pdo_mysql. Поиск следующего в phpinfo(),
pdo_mysql
PDO Driver for MySQL, client library version => 5.1.44
Я только что установил 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?
Поиск в Интернете не помог, все, что я получаю, это обмен экспертами и примеры, но никаких решений.
Вам нужен модуль pdo_mysql. Поиск следующего в phpinfo(),
pdo_mysql
PDO Driver for MySQL, client library version => 5.1.44
В вашем коде dsn показано, что вы пытаетесь подключиться к драйверу mysql. Ваше сообщение об ошибке указывает, что этот драйвер недоступен.
Убедитесь, что на вашем сервере установлено расширение mysql.
В Ubuntu/Debian вы проверяете пакет с помощью:
dpkg --get-selections | grep php | grep mysql
Установите пакет php5-mysql, если у вас его нет.
В Ubuntu/Debian вы можете использовать:
sudo apt-get install php5-mysql
sudo apt-get install php7.0-mysql
Наконец, чтобы заставить его работать, вам необходимо перезапустить веб-сервер:
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/nginx restart
Обновление: более новые версии должны использовать пакет 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), вам просто нужно запустить строки выше, и тогда вам будет хорошо идти.
Для более новых версий Ubuntu с PHP 7.0 вы можете получить пакет php-mysql
:
sudo apt-get install php-mysql
Затем перезагрузите сервер:
sudo service apache2 restart
На моей машине с Windows мне пришлось указать абсолютный путь к расширению dir в моем php.ini:
extension_dir = "c:\php5\ext"
Я была такая же проблема. Решение зависит от ОС. В моем случае у меня есть Debian, поэтому для его решения:
Установите 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
Это решает мою проблему
В Ubuntu просто выполните
sudo apt-get install php5-mysql
sudo apt-get install php-mysql
хорошо работал на ubuntu и php 7
Вы проверили свой php.ini(проверьте правильность расположения с помощью phpinfo()), если MySQL и драйвер установлены правильно?
При добавлении их в ваш php.ini убедитесь, что ссылка php_pdo.dll является первой до dll-драйверов db, иначе это также вызовет это сообщение об ошибке. Добавьте их так:
[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
Для 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
.
Я провел последний день, пытаясь понять, почему я получил следующую ошибку. Я запускаю 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, поскольку он не поставляется с ним по умолчанию.
для Windows 8.1/10 в файле:\\php.ini вы должны раскомментировать строку "extension = pdo_mysql"
Проверьте, доступен ли модуль с php -m | grep pdo_mysql
php -m | grep pdo_mysql
.
Если нет, для PHP 7.2 вы можете установить соответствующий пакет с помощью sudo apt install php7.2-mysql
.
Используйте аналогичную команду в других версиях PHP и менеджерах пакетов.
В моем случае моя строка DSN была неправильной, в частности, она не содержала mysql://.
Я бы ожидал другого сообщения об ошибке, возможно, что-то вроде строки DSN не указывает драйвер/протокол.
Добавление mysql://
в начало строки DSN устраняет проблему.
Проверьте правильность установки extension_dir в файле конфигурации php. Попробуйте прокомментировать/раскомментировать некоторые расширения и посмотреть, отразилось ли это на phpinfo(). Если это не так, либо файл конфигурации php не может быть загружен (неправильное местоположение). Extension_dir комментируется или устанавливается в неправильное местоположение.
Проблема заключается в отсутствии библиотеки php в mysql. В CentOs я исправил его, запустив
# yum install php-mysql
, а затем перезапуск apache с помощью # /bin/systemctl restart httpd.service
Обратите внимание, что именование немного отличается от дистрибутивов, основанных на debian/ubuntu, php- > php5 и httpd- > apache2.
Я очень рекомендую mysqllnd
вместо mysql
из-за того, что у вас будет много проблем, таких как преобразование числа и тип бит, и проблема с расширением mysql
.
на ubuntu install mysqllnd
со следующей командой:
sudo apt-get install php5-mysqlnd
Я исправил эту проблему на своем 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/
У меня возникла такая же проблема после того, как я удалил пакет 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)
Просто еще одна вещь, чтобы подтвердить, что некоторые люди копируют/вставляют пример кода из Интернета, чтобы начать. Убедитесь, что вы здесь MySQL:
... $dbh = new PDO ("mysql: ...
В некоторых примерах это показывает
$dbh = new PDO ("dblib ...
У меня была такая же проблема во время тестов с отдельным php.ini. Мне пришлось добавить эти строки в свой собственный файл php.ini:
[PHP]
extension = mysqlnd.so
extension = pdo.so
extension = pdo_mysql.so
Примечание: точно в этом порядке
В моем случае я использовал PDO с php-cli, и он работал нормально.
Только когда я попытался подключиться от apache, у меня возникла проблема с отсутствующим драйвером, что я не совсем понял.
Простой apt-get install php-mysql
решил. (Ubuntu 16.04/PHP7. Кредиты идут к выбранному ответу и комментарию Ивана)
Надеюсь, это поможет.
Для тех, кто использует 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
Куда бы я ни пошел, я читал, что путь extension_dir
должен быть изменен с ext
на абсолютный путь. Это сработало для меня. Однако, когда я пытался собрать сервер моего коллегиного ПК, мне пришлось допустить значение ext
вместо указания абсолютного пути.
Если вы указали абсолютный путь, и он все еще не найден, попробуйте как абсолютный путь, так и ext
.
Некорректная установка 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
и это сработало.
Проверьте правильный путь в extension_dir в вашем phpinfo().
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 '{}' \;
$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
Это сработало для меня.
У меня было то же исключение при попытке использовать 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