PDOException“找不到驱动程序”

我刚刚用Apache,MySQL和PHP安装了Debian Lenny,我收到了一个PDOException could not find driver

这是它所指的特定的代码行:

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

DB_HOSTDB_NAMEDB_USERDB_PASS是我定义的常量。 它在生产服务器(以及我之前的Ubuntu服务器设置)上工作正常。

这是我的PHP安装?

search互联网没有帮助,我得到的只是专家交stream和例子,但没有解决scheme。

您需要有一个名为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中,您可以使用:

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

最后,为了使其工作,您将需要重新启动您的networking服务器:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: 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服务器上),你只需要运行上面的行,然后你就可以走了。

在我的Windows机器上,我必须给我的php.ini中的扩展目录的绝对path:

extension_dir = "c:\php5\ext"

在Ubuntu上执行

 sudo apt-get install php5-mysql 

对于有PHP 7.0的较新版本的Ubuntu,你可以得到php-mysql包:

 sudo apt-get install php-mysql 

然后重新启动服务器:

 sudo service apache2 restart 

我遇到过同样的问题。 解决scheme取决于操作系统。 在我的情况下,我有debian,所以要解决它:

  • 更新我的php版本从php5到php7( 在这里input链接描述 )
  • 安装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 

这解决了我的问题

 sudo apt-get install php-mysql 

在Ubuntu和PHP 7上运行良好

你检查你的php.ini(检查正确的位置与phpinfo())如果MySQL和驱动程序安装正确?

当把这些添加到你的php.ini中时,确保php_pdo.dll引用是在db驱动程序dll之前,否则这也会导致这个错误信息。 像这样添加它们:

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

对于CentOS上的PHP 5.5 ,我通过安装php55-mysqlnd包来解决这个问题。

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

为了帮助安装,编写一个注释,因为它取决于您的系统上安装PHP的方式。 可用的回购是webtaticwebtatic

检查phpconfiguration文件中的extension_dir是否设置正确。 尝试评论/取消注释一些扩展名,看它是否反映在phpinfo()。 如果没有,那么无论是PHP的configuration文件无法加载(错误的位置)extension_dir被注释或设置为错误的位置。

在我的情况下,我的DSNstring不正确,特别是它不包含mysql://. 我会期望一个不同的错误消息,也许像'DSNstring不指定驱动程序/协议。

mysql://添加到DSNstring的开头解决了问题。

问题是一个缺less的PHP到MySQL库。 在CentOs中,我通过运行#yum # yum install php-mysql ,然后用# /bin/systemctl restart httpd.service启动apache来修复它。 # /bin/systemctl restart httpd.service请注意,命名与基于debian / ubuntu的发行版有所不同,php-> php5和httpd-> apache2 。

我极力推荐mysqllnd而不是mysql因为你会有很多问题,如数字转换和位types评估与mysql扩展的问题。

在Ubuntu上用以下命令安装mysqllnd

 sudo apt-get install php5-mysqlnd 

我花了最后一天,试图找出为什么我得到以下错误。 我正在运行Ubuntu 14.04。

问题:
我注意到我的PHP-CLI版本运行的是php7.0,但是php_info()(网页版本)显示的是php 5.5.9。 尽pipephp_info()表示启用了pdo,但使用命令行(CLI)却不能识别pdo_mysql命令。 事实certificate,我的旧版本,而不是CLI版本启用了MySQL。 我所做的只是为php7.0安装mysql,它能够工作。

这是什么工作:

要检查版本:

 php -v 

为php7.0安装mysql

 sudo apt-get install php7.0-mysql 

1)确保您的CLI版本与您的网页版本相同
2)如果它们不同,请确保您的CLI版本具有mysql插件,因为它没有作为默认值附带。

我在Debian 6上修正了这个问题。通常我只是安装了php5-common软件包。 安装完成后,您必须重新启动您的networking服务器(apache或nginx,取决于您安装的是哪一个)。 然后,我只是在apache进程id( lsof -p process_id )上做一个lsof ,如下所示:

 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 

正如您在上面看到的那样,这些模块安装在一个不知道的文件path上,或者被公共库path指引:/ usr/lib/php5/20090626/ 。 对于您的安装,它可能会有所不同,但只有pdo_mysql.so,pdo.so,mysqli.so的path。 所以,这就是为什么Drupal或任何其他PHP引擎无法find该库,并显示错误: PDOException: could not find driver

我只是不知道为什么它被安装在这样一个奇怪的path,对我来说,这只是在debian 6的库包安装脚本中的一个错误。我通过为/usr/lib/php5/20090626/下的所有文件创build一个符号解决了这个问题。 /usr/lib/php5/20090626/ to /usr/lib/php5/用这个命令:

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

 $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 

这对我有效。

我删除了php5软件包(包括所有的驱动程序)以便安装php7软件包后面临同样的问题。 我实际上安装了php7包,没有一个mysql模块。

我设法通过在terminal上键入来解决它:

1)$ apt-cache search php7其中列出了所有的模块,通过我find的模块,

php7.0-mysql – PHP的MySQL模块

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

而已。 它在我的linux系统中为我工作。

(使用适当的PHP版本,你可能是php5)

在我的情况下,我用php-cli使用PDO,它工作正常。

只有当我试图从apache连接,我得到了“我不明白的驱动程序”的问题,我不明白。

一个简单的apt-get install php-mysql解决了它。 (Ubuntu 16.04 / PHP7。学分转到选定的答案和Ivan的评论)

希望它可以帮助。

对于那些使用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 

我希望这有帮助

我在这里find了解决scheme: https : //github.com/doctrine/DoctrineBundle/issues/327

尝试使用pdo_sqlite时,我遇到了同样的exception。 问题是自动创build的20-pdo_sqlite.ini20-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寻找configuration

还有一件事要确认,就是有些人从互联网复制/粘贴示例代码开始。 确保你在这里input了MySQL:

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

这在一些例子中显示

 $dbh = new PDO ("dblib ... 

在使用单独的php.ini运行testing期间,我遇到了同样的问题。 我不得不将这些行添加到我自己的php.ini文件中:

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

注意:完全按照这个顺序

如果您正在使用sqlite进行testing,您将需要php sqlite pdo驱动器。 您可以按如下所示安装它们。

对于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 

对于Linux Mint

在使用PhpBrew(5.5.9 / 7.0.14)并尝试创buildPDO连接时,我遇到了同样的问题。

在我尝试了这篇文章的大部分解决scheme后,我做了以下工作:

  1. closuresPhpBrew

  2. 执行sudo apt-get install php7.0 (Linux Mint 17.2 / PHP7.0.16) – 安装了新鲜的php版本

有同样的问题,只是计算,网站运行在MAMP的PHP下,但是当你调用命令,它运行的Mac的(如果没有bashpath修改)。 当mac没有这些扩展名时,你将会遇到问题。

运行php -i查找加载的扩展,并安装那些你错过的。 或者运行“/Applications/MAMP/bin/php/php5.3.6/bin/php artisan {your command}”来使用MAMP

我通过在“IIS信息服务 – > PHP Exstention”中启用php_pdo_mysql.ddl来解决这个问题。

删除之前的分号; extension = php_pdo_mysql.dll在php.ini中保存。 别忘了重启xampp Apache和Mysql。

在我的情况下(Windows XP + Apache2.2 + PHP 5.4.31),我改变了httpd.conf PHPIniDir来解决这个问题:

从:

 "C:\php5\" 

至:

 "C:/php5/"