PDOException“找不到驱动程序”

时间:2010-05-17 20:57:05

标签: php mysql pdo lamp

我刚刚用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 Server设置)上运行良好。

这与我的PHP安装有关吗?

搜索互联网没有帮助,我得到的只是专家交流和示例,但没有解决方案。

39 个答案:

答案 0 :(得分:209)

您需要一个名为pdo_mysql的模块。在phpinfo()中寻找以下内容,

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

答案 1 :(得分:181)

代码中的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

答案 2 :(得分:73)

更新:较新的版本应使用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服务器上),你只需要运行上面的行,然后就可以了。

答案 3 :(得分:26)

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

sudo apt-get install php-mysql

然后重启服务器:

sudo service apache2 restart

答案 4 :(得分:21)

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

extension_dir = "c:\php5\ext"

答案 5 :(得分:16)

我有同样的问题。解决方案取决于操作系统。就我而言,我有debian,所以要解决它:

  • 从(php5 to php7
  • 更新了我的php版本
  • 安装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
    

这解决了我的问题

答案 6 :(得分:14)

在Ubuntu上执行

sudo apt-get install php5-mysql

答案 7 :(得分:9)

sudo apt-get install php-mysql 

在ubuntu和php 7上运行良好

答案 8 :(得分:5)

将这些添加到php.ini中时,请确保在db驱动程序dll之前首先引用php_pdo.dll,否则这也会导致此错误消息。像这样添加它们:

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

答案 9 :(得分:5)

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

答案 10 :(得分:4)

对于PHP 5.5上的CentOS,我通过安装php55-mysqlnd软件包解决了此问题。

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

有关安装的帮助,请编写注释,因为它取决于系统上PHP的安装方式。可用的回购邮件是webtaticremi

答案 11 :(得分:3)

对于Windows 8.1 / 10:\\ php.ini文件,你应该取消注释行" extension = pdo_mysql"

答案 12 :(得分:3)

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

问题:
我注意到我的PHP-CLI版本运行的是php7.0但是php_info()(网络版)显示的是PHP 5.5.9。即使php_info()表示启用了pdo,使用命令行(CLI)也无法识别pdo_mysql命令。事实证明,我的旧版本启用了mysql,但未启用CLI版本。我所做的只是为php7.0安装mysql,它能够工作。

这是有用的:

检查版本:

php -v

为php7.0安装mysql

sudo apt-get install php7.0-mysql

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

答案 13 :(得分:2)

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

答案 14 :(得分:2)

在我的情况下,我的DSN字符串不正确,特别是它不包含mysql://.我本来期望一个不同的错误消息,可能类似'DSN字符串不指定驱动程序/协议。'

mysql://添加到DSN字符串的开头解决了问题。

答案 15 :(得分:2)

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

答案 16 :(得分:2)

我非常推荐mysqllnd而不是mysql,因为您会遇到许多问题,例如数字转换和位类型评估mysql扩展名的问题。

在ubuntu上使用以下命令安装mysqllnd

sudo apt-get install php5-mysqlnd

答案 17 :(得分:1)

我在Debian 6上修复了这个问题。 通常我刚刚安装了php5-common包。安装后,您必须重新启动Web服务器(apache或nginx,具体取决于您安装的服务器)。 然后我只对apache进程id(lsof)执行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/

答案 18 :(得分: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 '{}' \;

答案 19 :(得分:1)

在您的phpinfo()中检查extension_dir中的正确路径。

答案 20 :(得分: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

它奏效了。

答案 21 :(得分:1)

我到处都读到extension_dir的路径应该从ext更改为绝对路径。它对我有用。但是,在尝试构建同事PC的服务器时,我不得不将值设为ext而不是放置绝对路径。

如果您确实设置了绝对路径并且仍未找到扩展名,请考虑使用绝对路径和ext进行扩展。

答案 22 :(得分: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

答案 23 :(得分:1)

在我的情况下,我使用PDO和php-cli,它运行良好。

只有当我尝试从apache连接时,才会遇到“缺少驱动程序”的问题,我不太明白。

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

希望它可以提供帮助。

答案 24 :(得分:1)

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

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

注意:正好按此顺序

答案 25 :(得分:1)

另外还有一件事需要确认,因为有些人正在从互联网上复制/粘贴示例代码以开始使用。确保你在这里输入了MySQL:

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

在某些例子中,这显示了

$dbh = new PDO ("dblib ...

答案 26 :(得分:1)

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

我设法通过在终端输入来解决它:

1)$ apt-cache搜索php7 其中列出了所有模块,查看了我找到的模块,

php7.0-mysql - 用于PHP的MySQL模块

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

就是这样。它在我的linux系统中对我有用。

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

答案 27 :(得分:0)

如果您使用sqlite进行测试,则需要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

答案 28 :(得分:0)

对于Linux Mint

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

在我尝试了这篇文章的大部分解决方案之后,我做了以下几点:

  1. 关闭PhpBrew

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

答案 29 :(得分:0)

如果您阅读了以上所有答案,但仍然无法正常工作...

确保您的PHP PDO连接字符串正确。不像我的:

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

错误消息中没有信息,找不到哪个驱动程序。

重新安装所有可能的PDO和MySQL库后,我发现连接字符串开头有

答案 30 :(得分:0)

尝试使用pdo_sqlite时遇到了同样的异常。问题是自动创建的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中查找配置

答案 31 :(得分:0)

遇到了同样的问题,因为我忘记进入虚拟机。如果我这样进入本地目录:

cd /www/homestead/my_project
php artisan migrate

该错误将出现。但是它可以在我的虚拟机上运行

cd ~/homestead
vagrant ssh   
cd /www/homestead/my_project
php artisan migrate

答案 32 :(得分:0)

检查模块是否适用于php -m | grep pdo_mysql

否则,对于PHP 7.2,可以使用sudo apt install php7.2-mysql安装相关的软件包。

在其他PHP版本和程序包管理器上使用类似的命令。

答案 33 :(得分:0)

$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

这对我有用。

答案 34 :(得分:-1)

对我来说,解决方案是安装php,请不要正确配置环境变量和php.ini文件。进行这两次更正,extension = pdo_mysql.so的未划定轮廓会起作用

答案 35 :(得分:-2)

我通过在“IIS信息服务 - &gt; PHP Exstention”中启用php_pdo_mysql.ddl解决了这个问题。

答案 36 :(得分:-2)

有同样的问题,只是想通了,网站在MAMP的php下运行,但是当你在命令中调用时,它会运行mac(如果没有修改bash路径)。当mac没有这些扩展时你会遇到问题。

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

答案 37 :(得分:-3)

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

答案 38 :(得分:-6)

在我的情况下(Windows XP + Apache2.2 + PHP 5.4.31)我更改了PHPIniDir中的httpd.conf以解决此问题:

来自:

"C:\php5\" 

到:

"C:/php5/"