PDOException“找不到驱动程序”


292

我刚刚用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_USER,和DB_PASS是我所定义的常量。它在生产服务器(以及我以前的Ubuntu Server设置)上运行良好。

这与我的PHP安装有关吗?

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


21
查看您的php.ini' file and uncomment extension = php_pdo_mysql.dll . The path to your php.ini文件,可以通过查看您的phpinfo()找到。
styfle 2012年

3
仅供参考,如果以后收到此错误,并且GoDaddy是您的主机,请登录admin帐户。托管详细信息->编程语言。将您的PHP版本升级到最新版本或至少5.4
Joe

@Joe我已升级但仍然收到错误(GoDaddy)
Eugen Sunic 2015年

@styfle 1up,在Linux机器上,我进行了设置extension=msql.so,它可以工作了!
AjayKumarBasuthkar

可能对谁有关:如果您在docker上使用php 7.1+,则可以docker exec进入容器并运行docker-php-ext-install pdo pdo_mysql
cleybertandre

Answers:


240

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

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

2
@ZZ Coder这在phpinfo()中不存在。你知道我该怎么安装pdo_mysql吗?
Mike Moore 2010年

14
@letseatfood ...您如何解决这个问题?我遇到了同样的问题!
赫里斯特

17
我可以推荐Ubuntu“ php5-mysql”软件包来安装对MySQL的PDO支持
Tom Carver 2013年

3
请注意,对于那些使用Apache或其他Web服务器的用户,需要重新启动Apache才能使更改生效:sudo systemctl restart httpd.service
Mugoma J. Okomba,2016年

50
对于Ubuntu 16.04和PHP7,请使用-Ivan sudo apt-get install php-mysql
Marjanovic

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

最后,要使其正常运行,您将需要重新启动Web服务器:

  • 阿帕奇: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart

3
啊...重启对我来说是什么!
KOGI 2015年

我有同样的问题,请确保您重新启动php5-fpm!
Eko3alpha

花了整整一个晚上试图破解,直到我看到你的答案。一切都做得正确,但是忘记重新启动apache。
Mugoma J. Okomba,

php-mysql已经是最新版本(1:7.1 + 49 + deb.sury.org〜xenial + 4)。当尝试使用nginx php fpm在ubuntu 16.04中运行命令sudo apt-get install php-mysql时,我还要重新启动php fpm,然后重新启动nginx。
Prashant Barve

当前它似乎是php-mysql和php7.1-mysql。希望这是向前发展的模式。
约翰·P

83

更新:较新的版本应使用php-sqlite3package而不是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
当OP使用MySQL时,为什么要给出有关sqlite的说明?
Andrew Ensley 2012年

7
@Andrew如果您使用pdo_sqlite但未安装php5-sqlite,则只会得到一个PDOException有关缺少sqlite的信息,并尝试安装php5-mysql两次。
Aitch

2
请注意,php5-sqlite已过时,可能不再适用于您的系统,即Ubuntu 16.04。改为安装php-sqlite3。
Matthias

2
@briankip当然可以,如果您尝试连接到SQLite而该驱动程序丢失了。但是OP正在尝试连接到MySQL。安装sqlite无法解决他的问题。
安德鲁·恩斯利

2
@AndrewEnsley。此页面的标题是每个人(无论其数据库平台如何)都会收到的错误。结果,如果您只是搜索错误,则此页面具有最高的google搜索排名。因此,国际海事组织(IMO),对此问题与其他数据库有关的任何答案都应受到欢迎。如果他们对OP不起作用,那就... OP不必接受那些答案。这并不意味着该答案对调查带有Zoltar搜索排名的问题的标题中的错误消息的其他人“无用”。+1
elrobis

34

对于具有PHP 7.0的较新版本的Ubuntu,可以获取此php-mysql软件包:

sudo apt-get install php-mysql

然后重新启动服务器:

sudo service apache2 restart

我认为现在您必须特定于版本sudo apt-get install php7.2-mysql
Stan Sokolov

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

这解决了我的问题


顺便说一句对那些像我谁发现这并没有完全不够的,不想一步步地去完全验证PHP7工作之前删除PHP5: ,a2dismod php5a2enmod php7.0service apache2 restart终于让我恢复正常运行。
depwl9992

21

在Windows计算机上,我必须在php.ini中提供扩展目录的绝对路径:

extension_dir = "c:\php5\ext"


2
我刚刚确认这是真的(Win2008)。奇怪-其他扩展仅适用于建议的扩展名extension_dir = "ext",但不适用于此扩展名。
scipilot 2014年

同样在这里。添加了路径并开始工作。Windows10,php7.1
克里斯·吉布

14

在Ubuntu上只需执行

sudo apt-get install php5-mysql

1
我当时支持Symfony2和Ubuntu。未找到Pdo_mysql([PDOException]找不到驱动程序)。这解决了问题。
2013年

2
对我而言,我缺少Postgresql,所以它最终成为:sudo apt-get install php5-pgsql
Kzqai

@Kzqai 2:30 am现在,您刚刚解决了我的问题,我没有使用mysql我正在使用postgres(>ლ)
Dheeraj


9

使用检查模块是否可用php -m | grep pdo_mysql

如果不是,对于PHP 7.2,可以使用安装相关的软件包sudo apt install php7.2-mysql

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


6

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

[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

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


2
我正在寻找php.ini,但是我应该寻找什么?我看到一段以[MySQL]
Mike Moore

4

对于PHP 5.5CentOS我通过安装php55-mysqlnd软件包来解决。

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

要获得安装帮助,请写注释,这取决于系统上PHP的安装方式。可用的仓库是webtaticremi



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版本未启用。我所做的就是为php7.0安装mysql,它能够正常工作。

这是有效的:

要检查版本:

php -v

为php7.0安装mysql

sudo apt-get install php7.0-mysql

1)确保您的CLI版本与Web版本相同
2)如果它们不同,请确保您的CLI版本具有mysql插件,因为默认情况下没有它。


2

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


2

问题是缺少php到mysql库。在CentO中,我通过运行# 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软件包。安装后,您必须重新启动Web服务器(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/为to 下的所有文件创建符号来解决了这个问题/usr/lib/php5/

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


php-mysql已经是最新版本(1:7.1 + 49 + deb.sury.org〜xenial + 4)。
Prashant Barve'1

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
没有驱动程序,该用户仍将获得相同的例外
eggmatters 2014年

1

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

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

1)$ apt-cache search php7列出了所有模块,浏览我发现的模块,

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

2)$ sudo apt-get安装php7.0-mysql

而已。它在我的linux系统中对我有用。

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


1

还要确认一点,因为有些人正在从Internet复制/粘贴示例代码以开始使用。确保您在此处输入了MySQL:

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

在某些示例中,这表明

$dbh = new PDO ("dblib ...

1

就我而言,我将PDO与php-cli一起使用,并且效果很好。

只有当我尝试从apache连接时,我才遇到“驱动程序丢失”的问题,对此我不太了解。

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

希望能有所帮助。


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


1

我到处走走,我读到extension_dir应该将的路径从ext绝对路径更改为绝对路径。它为我工作。但是,当尝试构建同事的PC服务器时,我不得不让价值成为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.3phpinfo.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'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 '{}' \;

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.