PDOException“找不到驱动程序”
Posted
技术标签:
【中文标题】PDOException“找不到驱动程序”【英文标题】:PDOException “could not find driver” 【发布时间】:2022-01-23 05:08:33 【问题描述】:我刚刚使用 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_HOST
、DB_NAME
、DB_USER
和 DB_PASS
是我定义的常量。它在生产服务器(以及我之前的 Ubuntu 服务器设置)上运行良好。
这与我的 PHP 安装有关吗?
搜索互联网没有帮助,我得到的只是专家交流和示例,但没有解决方案。
【问题讨论】:
查看你的php.ini' file and uncomment
extension=php_pdo_mysql.dll. The path to your
php.ini`文件可以通过查看你的phpinfo()找到。
仅供未来读者参考,如果您收到此错误并且 GoDaddy 是您的主机,请登录您的管理员帐户。托管详细信息-> 编程语言。将您的 PHP 版本升级到最新或至少 5.4
@Joe 我升级了,但仍然出现错误 (GoDaddy)
它可能关心的人:如果你在 docker 上使用 php 7.1+,你可以 docker exec
进入容器并运行 docker-php-ext-install pdo pdo_mysql
。
你可以,但你不应该。像这样所做的更改只存在于短暂的临时容器中,并且很容易因重新启动、重建和更新而丢失。相反,您应该将该行添加到 Dockerfile 以确保它成为 Docker 映像的永久部分。
【参考方案1】:
您需要有一个名为 pdo_mysql 的模块。在phpinfo()中寻找关注,
pdo_mysql
PDO Driver for MySQL, client library version => 5.1.44
【讨论】:
@Hristo 我认为pdo_mysql
模块不是 Debian Lenny 中默认软件包的一部分
我可以推荐 Ubuntu "php5-mysql" 包来安装对 MySQL 的 PDO 支持
请注意,对于使用 Apache 或其他 Web 服务器的用户,需要重新启动 Apache 才能使更改生效:sudo systemctl restart httpd.service
对于 Ubuntu 16.04 和 PHP7 使用 sudo apt-get install php-mysql
在 CLI 中,您可以通过以下方式验证您的安装:php -i | grep pdo_mysql
【参考方案2】:
代码中的 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
最后,为了让它工作,你需要重启你的网络服务器:
阿帕奇:sudo /etc/init.d/apache2 restart
nginx:sudo /etc/init.d/nginx restart
【讨论】:
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。 目前好像是php-mysql和php7.1-mysql。希望这是向前发展的模式。【参考方案3】:更新:较新的版本应该使用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 服务器上),您只需要运行上面的行,然后就可以开始了。
【讨论】:
OP 使用 MySQL 的时候为什么要给 sqlite 的说明? @Andrew 如果你使用pdo_sqlite
并且没有安装php5-sqlite
你只会得到一个PDOException
没有关于缺少sqlite 的信息并尝试安装php5-mysql
两次。
请注意,php5-sqlite 已经过时,可能不再适用于您的系统,即 Ubuntu 16.04。改为安装 php-sqlite3。
@briankip 当然可以,如果您尝试连接到 SQLite 并且缺少该驱动程序。但是 OP 正在尝试连接到 MySQL。安装 sqlite 将/无法解决他的问题。
@AndrewEnsley。此页面的标题是每个人都会遇到的错误,无论他们的数据库平台如何。因此,如果您只搜索错误,则此页面具有最高的 google 搜索排名。因此,IMO,任何与其他数据库相关的问题的答案都应该在这里受到欢迎。如果它们不适用于 OP,那就这样吧……OP 不必接受这些答案。这并不意味着这个答案对其他调查标题中的错误消息的人没有“有用”,该错误消息赋予了这个问题与 Zoltar 的搜索排名。 +1【参考方案4】:
对于具有 PHP 7.0 的较新版本的 Ubuntu,您可以获得 php-mysql
包:
sudo apt-get install php-mysql
然后重启你的服务器:
sudo service apache2 restart
【讨论】:
我认为现在你必须具体使用版本 sudo apt-get install php7.2-mysql【参考方案5】:我有同样的问题。解决方案取决于操作系统。就我而言,我有 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
这解决了我的问题
【讨论】:
顺便说一句,对于像我这样发现这还不够并且不想在验证 php7 是否有效之前完成完全删除 php5 的步骤的人:a2dismod php5
, @987654327 @ 和 service apache2 restart
终于让我重新振作起来。【参考方案6】:
在我的 Windows 机器上,我必须在我的 php.ini 中提供扩展目录的绝对路径:
extension_dir = "c:\php5\ext"
【讨论】:
我刚刚确认这是真的 (Win2008)。奇怪 - 其他扩展只适用于推荐的extension_dir = "ext"
,但不是这个。
这里也一样。添加路径并开始工作。 Windows10、php7.1【参考方案7】:
在 Ubuntu 上执行
sudo apt-get install php5-mysql
【讨论】:
我支持 Symfony2 和 Ubuntu。未找到 Pdo_mysql([PDOException] 找不到驱动程序)。这解决了问题。 对我来说,我缺少 Postgresql,所以它最终成为:sudo apt-get install php5-pgsql
【参考方案8】:
通过php -m | grep pdo_mysql
检查模块是否可用。
如果没有,对于 PHP 7.2,您可以使用sudo apt install php7.2-mysql
安装相关包。
在其他 PHP 版本和包管理器上使用类似的命令。
【讨论】:
【参考方案9】:sudo apt-get install php-mysql
在 ubuntu 和 php 7 上运行良好
【讨论】:
它对我有用,虽然我使用的不是php7而是php5.6。但我确实安装了 7 个。我后来安装了 5.6 并在没有卸载 php7 的情况下切换到该版本【参考方案10】:将这些添加到您的 php.ini 时,请确保 php_pdo.dll 引用位于 db 驱动程序 dll 之前,否则这也会导致此错误消息。像这样添加它们:
[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
【讨论】:
自 PHP v5.3 起,php_pdo.dll
模块不再需要(不存在)。 php.net/manual/en/pdo.installation.php 可能是这个问题的终极答案。【参考方案11】:
如果 MySQL 和驱动程序安装正确,您是否检查了您的 php.ini(使用 phpinfo() 检查正确的位置)?
【讨论】:
我正在寻找 php.ini,但我应该寻找什么?我看到一个以[MySQL]
开头的部分【参考方案12】:
对于CentOS
上的PHP 5.5
,我通过安装php55-mysqlnd
软件包解决了这个问题。
sudo yum -y install php55w-mysqlnd # For Webtatic
sudo yum -y install php55u-mysqlnd # For Remi
如需帮助安装,请写下注释,因为这取决于 PHP 在您的系统上的安装方式。可用的 repo 是 webtatic
和 remi
。
【讨论】:
【参考方案13】:对于 :\\php.ini 文件中的 Windows 8.1/10,您应该取消注释行“extension=pdo_mysql”
【讨论】:
【参考方案14】:检查 php 配置文件中的 extension_dir 是否设置正确。尝试注释/取消注释一些扩展,看看它是否反映在 phpinfo() 上。 如果没有,则无法加载 php 配置文件(错误位置)extension_dir 被注释或设置为错误位置。
【讨论】:
【参考方案15】:在我的情况下,我的 DSN 字符串不正确,特别是它不包含 mysql://.
我本来预计会出现不同的错误消息,可能类似于“DSN 字符串未指定驱动程序/协议”。
将mysql://
添加到 DSN 字符串的开头解决了该问题。
【讨论】:
【参考方案16】:我在使用单独的 php.ini 运行测试时遇到了同样的问题。我不得不将这些行添加到我自己的 php.ini 文件中:
[PHP]
extension = mysqlnd.so
extension = pdo.so
extension = pdo_mysql.so
注意:完全按照这个顺序
【讨论】:
【参考方案17】:我花了最后一天试图弄清楚为什么会出现以下错误。我正在运行 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 插件,因为它没有默认附带它。
【讨论】:
【参考方案18】:调用的 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 位置 = 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
它成功了。
【讨论】:
【参考方案19】:问题是缺少 php 到 mysql 库。在 CentOs 我通过运行修复它
# yum install php-mysql
然后用 # /bin/systemctl restart httpd.service
重启 apache 注意命名与基于 debian/ubuntu 的发行版 php->php5 和 httpd->apache2 略有不同。
【讨论】:
【参考方案20】:我极力推荐mysqllnd
而不是mysql
,因为mysql
扩展会有很多问题,例如数字转换和位类型评估问题。
在 ubuntu 上使用以下命令安装 mysqllnd
:
sudo apt-get install php5-mysqlnd
【讨论】:
【参考方案21】:我在我的 Debian 6 上修复了这个问题。
通常我刚刚安装了php5-common
包。安装后,您必须重新启动您的网络服务器(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.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/
【讨论】:
php-mysql已经是最新版本了(1:7.1+49+deb.sury.org~xenial+4)。【参考方案22】:$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
这对我有用。
【讨论】:
没有驱动,这个用户还是会遇到同样的异常【参考方案23】:我在删除 php5 包(也包括所有驱动程序)以安装 php7 包后遇到了同样的问题。我实际上安装了没有mysql模块的php7包。
我设法通过在终端中输入来解决它:
1) $ apt-cache search php7 其中列出了所有模块,查看我找到的模块,
php7.0-mysql - PHP 的 MySQL 模块
2) $ sudo apt-get install php7.0-mysql
就是这样。它在我的 linux 系统中对我有用。
(使用合适的php版本,你的可以是php5)
【讨论】:
【参考方案24】:还有一件事需要确认,因为有些人正在从 Internet 复制/粘贴示例代码以开始使用。确保您在此处输入了 MySQL:
... $dbh = new PDO ("mysql: ...
在一些例子中显示
$dbh = new PDO ("dblib ...
【讨论】:
【参考方案25】:在我的例子中,我使用 PDO 和 php-cli,它运行良好。
只有当我尝试从 apache 连接时,我才遇到“缺少驱动程序”的问题,我不太明白。
一个简单的apt-get install php-mysql
解决了它。 (Ubuntu 16.04 / PHP7。学分转到所选答案和 Ivan 的评论)
希望对你有帮助。
【讨论】:
【参考方案26】:对于那些使用 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
【讨论】:
【参考方案27】:无论我走到哪里,我都读到extension_dir
的路径应该从ext
更改为绝对路径。它对我有用。但是,在尝试为同事的 PC 构建服务器时,我不得不将值设为 ext
而不是放置绝对路径。
如果您确实放置了绝对路径,但仍然找不到扩展名,请考虑同时使用绝对路径和ext
。
【讨论】:
【参考方案28】:在您的 phpinfo() 中检查 extension_dir 中的正确路径。
【讨论】:
【参考方案29】:遇到了同样的问题,因为我忘了进入我的虚拟机。如果我像这样进入我的本地目录:
cd /www/homestead/my_project
php artisan migrate
将出现该错误。但它适用于我的虚拟机
cd ~/homestead
vagrant ssh
cd /www/homestead/my_project
php artisan migrate
【讨论】:
【参考方案30】:PHP Fatal error: Uncaught PDOException: could not find driver
我一直在为“apt install php-mysql php7toInfinity and don't forget 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 '' \;
【讨论】:
以上是关于PDOException“找不到驱动程序”的主要内容,如果未能解决你的问题,请参考以下文章
php - PDOException 找不到驱动程序 [重复]