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 server设置)上运行良好。

这与我的PHP安装有关吗?

在网上搜索也没有帮助,我得到的都是专家交流和例子,但没有解决方案。

1128077 次浏览

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

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

pdo_mysql


PDO Driver for MySQL, client library version => 5.1.44

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

代码中的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服务器:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart

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

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

检查php配置文件中的extension_dir设置是否正确。尝试注释/取消注释一些扩展,看看它是否反映在phpinfo()上。 如果它没有,那么php配置文件不能加载(错误的位置)extension_dir被注释或设置到错误的位置。< / p >

我修复了我的Debian 6的这个问题。 通常我只是安装了php5-common包。安装后,你必须重新启动你的web服务器(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

如上所述,模块安装在一个文件路径上,该文件路径未知,也不受公共库路径引导:/usr/lib/php5/20090626/。对于您的安装,它可能不同,但只有pdo_mysql的路径。所以,pdo。所以,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/

在Ubuntu上执行

sudo apt-get install php5-mysql
$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

这对我很管用。

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

extension_dir = "c:\php5\ext"

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

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

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

我在尝试使用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中的配置

当添加这些到你的php.ini时,确保php_pdo.dll引用在db驱动dll之前,否则这也会导致这个错误消息。像这样加起来:

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

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

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

我通过启用php_pdo_mysql解决了这个问题。“IIS信息服务- > PHP扩展”中的ddl。

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

来自:

"C:\php5\"

:

"C:/php5/"
问题是缺少php到mysql库。在CentOs中,我通过运行来修复它 注意,命名与基于debian/ubuntu的发行版略有不同,php->php5和httpd->apache2.

. php->php5和httpd->apache2

在php.ini中删除;扩展= php_pdo_mysql.dll前的分号并保存。 不要忘记重启xampp Apache和Mysql

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

我在终端中输入:

1) $ apt-cache搜索php7 它列出了所有的模块,通过我找到的模块,

PHP的MySQL模块

2)安装php7.0-mysql

就是这样。它适用于我的linux系统。

(使用合适的PHP版本,你的可以是php5)

sudo apt-get install php-mysql

在ubuntu和PHP 7上运行良好

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

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

在一些例子中可以看到

$dbh = new PDO ("dblib ...

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

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

注意:正是这个顺序

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

sudo apt-get install php-mysql

然后重新启动服务器:

sudo service apache2 restart

我强烈推荐mysqllnd而不是mysql,因为你会有很多问题,比如数字转换和位类型计算问题,用mysql扩展。

在ubuntu install mysqllnd上执行以下命令:

sudo apt-get install php5-mysqlnd
如果你正在使用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

在我的例子中,我使用PDO和php-cli,它工作得很好。

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

一个简单的apt-get install php-mysql解决了这个问题。Ubuntu 16.04 / PHP7。积分转到所选答案&伊万的评论)

希望能有所帮助。

我花了最后一天的时间试图弄清楚为什么我会得到以下错误。我运行的是Ubuntu 14.04。

< p > 存在的问题: < br > 我注意到我的php - cli版本运行的是php7.0,但php_info() (web版本)显示的是php 5.5.9。尽管php_info()说pdo已启用,但使用命令行(CLI)无法识别pdo_mysql命令。原来我的旧版本启用了mysql,但CLI版本没有启用。我所做的就是为php7.0安装mysql,它就可以工作了

这是有效的方法:

查询版本号:

php -v

安装mysql for php7.0

sudo apt-get install php7.0-mysql

1)确保您的CLI版本与您的web版本相同 2)如果它们是不同的,确保你的CLI版本有mysql插件,因为它没有作为默认提供。< / p >

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

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版本

我也有同样的问题。解决方案取决于操作系统。在我的情况下,我有debian,所以解决它:

  • 从(Php5到php7)更新我的php版本
  • 安装php-mysql和php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
    
  • I edited my php.ini locate at /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
    
  • Then restart apache:

    service apache2 restart
    

This solves my problem

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

无论我走到哪里,我都读到extension_dir的路径应该从ext改为绝对路径。这对我很管用。然而,当试图构建我同事PC的服务器时,我不得不让值为ext,而不是放置绝对路径。

如果你确实放置了一个绝对路径,并且它仍然没有找到扩展名,请考虑同时尝试使用绝对路径和ext

正在调用不正确的PHP安装

我也遇到过同样的问题。我希望这能帮助到和我有类似问题的人。

场景

OS = Windows 10
Platform = XAMPP
PHP Version = 7 (Multiple Version seem to have been installed in the PC)

我在public文件夹中创建了phpinfo.php文件,并运行phpinfo()来查找我的php.ini文件的位置。

PHP.ini Location = c:\xampp\php\php.ini

< p > 问题 < br > 调用c:\xampp\htdocs> php -v返回PHP 7.2.3,但phpinfo.php显示PHP 7.2.2。< / p > < p > 解决方案 < br > 而不是调用

php artisan migrate:install

它给了我这个错误,我用了

c:\xampp\php\php artisan migrate:install

这招奏效了。

如果你读了上面所有的答案,它仍然不工作…

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

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

错误消息中没有没有找到驱动程序的信息。

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

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

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

cd /www/homestead/my_project
php artisan migrate

这个错误就会出现。但它在我的虚拟机上运行

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

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

如果没有,对于PHP 7.2,你可以用sudo apt install php7.2-mysql安装相关的包。

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

PHP Fatal error:  Uncaught PDOException: could not find driver

我挣扎着,挣扎着“apt安装php-mysql php7toInfinity和不要忘记sqlite- whatever -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 '{}' \;

我的解决方案是在安装php时,没有正确配置环境变量和php.ini文件。对extension = pdo_mysql.so的未注释de line进行两次更正

我有同样的错误共享主机使用cPanel。默认情况下,如果安装了mysqlnd,则安装了pdo_mysql扩展。

但事实并非如此,我必须启用nd_pdo_mysql扩展才能使用PDO。我使用PHP选择器GUI来更改它,但这是因为我懒得设置SSH连接。

O,忘记添加服务器是Apache和MariaDB(经常忘记,尽管MariaDB与MySql具有相同的父级,但在底层,一些功能可能会略有不同)。

PHP < p > 8.0 Laravel 8.0 < / p >