PHP致命错误:找不到类“PDO”

66
PHP Fatal error:  Class 'PDO' not found in /home/bd/public_html/app/webroot/Cake/Model/Datasource/Database/Mysql.php on line 177

PHP 信息:

PDO

PDO support => enabled
PDO drivers => sqlite, sqlite2, mysql

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => 5.5.24

Directive => Local Value => Master Value
pdo_mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock

pdo_sqlite

PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.7.7.1

PHP INI:

extension=pdo.so
extension=pdo_sqlite.so
extension=sqlite.so
extension=pdo_mysql.so

代码:

/**
 * Check whether the MySQL extension is installed/loaded
 *
 * @return boolean
 */
        public function enabled() {
                return in_array('mysql', PDO::getAvailableDrivers());
        }

我为什么会出现这个错误的想法?

PHP 5.3.15 CloudLinux/CentOS 6 CPanel


2
debug(PDO::getAvailableDrivers()); 的输出是什么? - tigrang
1
似乎是一个服务级别支持的问题? - Jared Farrish
"调试设置不允许访问此URL",将其添加到自己的PHP文件中并运行。 - Amanada Smith
3
你是如何获取php_info输出的?如果是通过CLI获取的,输出可能会有所不同,因为cPanel使用了单独的PHP二进制文件而不是CentOS的那个。 - Geoffrey
我有同样的问题。你解决了吗?这可能也会对我有帮助。 - YahyaE
显示剩余3条评论
15个回答

77

尝试

 yum install php-pdo
 yum install php-pdo_mysql

 service httpd restart

3
@s4suryapal:在 Linux 服务器的控制台命令行中运行它。在 Windows 上,您可以取消注释 php.ini 中的 extension=php_pdo_mysql.dll 行(例如:xampp、wamp 等),然后重新启动 Apache。 - Nam Nguyen
问题意味着他已经安装了PDO(来自phpinfo的引用),因此为-1。 - Putnik
我该如何在CentOS 5.8上安装PHP PDO用于Oracle? - Sanjay Rao

75
尝试在您的命名空间后面、类前面或在您的 PHP 文件顶部添加 use PDO;

6
对于我来说,这就可以了……我正在一个命名空间类中,简单地在 PDO 前面添加一个 \,像其他地方建议的那样并不能起作用 - 但是这个方法可以 :) - erlingormar
问题没有提到他是否使用命名空间。如果有人为所有其他客户类使用命名空间,那么这应该是可以接受的答案。因为在代码中的某个地方,他错过了 use PDO。否则需要将正确的PDO版本库安装到他们的Web服务器中。 - Elshan
这对我非常有帮助。谢谢你。如果有人想知道,这也适用,因为PDO是PHP中的全局类。 - wowzuzz

22
这种情况也可能发生在 Web 应用程序的当前工作目录中存在 php.ini 文件的情况下。如果已经放置了该文件以更改某些设置,则它将覆盖全局设置。
为避免此问题,请不要使用 php.ini 文件更改设置;而是可以:
  • 在 vhost 声明中指定设置
  • 使用带有 php_flag.htaccess 文件(参见此处
  • 使用 .user.ini 文件(参见此处

嗨,阿拉斯泰尔,我稍微扩展了一下你的答案。希望没问题。;-) - Simon East
你能举个例子说明如何在 .htaccess 中添加 pdo 吗?谢谢! - erol yeniaras

15

确保在php.ini文件中调用它们

如果PDO显示在当前安装的PHP模块列表中,则需要检查相关文件夹中的php.ini文件,确保调用了它们。在php.ini文件的某个地方,您应该看到以下内容:

extension=pdo.so
extension=pdo_sqlite.so
extension=pdo_mysql.so
extension=sqlite.so
如果它们不存在,只需将上述行添加到php.ini文件底部并保存即可。

10

文件Mysql.php的完整源代码是什么?根据php信息列表的输出,看起来您可能正在尝试从命名空间中引用全局类。

如果文件Mysql.php中有"namespace "语句,请使用\PDO替换PDO - 这将告诉PHP查找全局类,而不是在本地命名空间中查找。


好吧,没有命名空间,我又被卡住了。 - Stephen
我只是在想这个脚本是否编码不佳。我不得不将Cake框架移动到Webroot目录中才能走到这一步;/ 脚本是:http://www.freereviewscript.com/p/requirements - Amanada Smith

3

虽然有点晚,但我发现相同的问题并通过在PDO前加上“\”来解决它。

public function enabled() {
    return in_array('mysql', \PDO::getAvailableDrivers());
}

你可以使用multi_query来实现你所描述的功能(https://dev59.com/6GUq5IYBdhLWcg3wMNcK#22469722),但是你不应该这样做。`multi_query()` 不允许参数化,你应该使用单个预处理语句进行循环执行,并在执行过程中获取新的id。 - mickmackusa
将此代码进行调整:https://stackoverflow.com/a/25939954/2943403 以获取新的ID,读完这些评论后请告诉我,以便我可以删除它们。 - mickmackusa

3
您可以通过执行以下命令轻松找到已加载的配置文件:
 php -i | grep 'php.ini'

然后将以下行添加到正确的php.ini文件中

extension=pdo.so
extension=pdo_sqlite.so
extension=pdo_mysql.so
extension=sqlite.so

然后重新启动Web服务器。

service httpd restart

3
我在GoDaddy上遇到了同样的问题。我在php.ini中添加了extension=pdo.so,但仍然不起作用。然后我只想到一件事:权限。
在上传文件之前,先结束所有PHP进程(cPanel-> PHP进程)。
问题在于文件权限设置为0644,无法执行。您需要将文件权限设置至少为0755。

Permissions


1
对于 Fedora 33,您可以按照以下步骤进行安装:
安装
dnf install php-pdo
dnf install php-pdo_mysql

重启PHP

systemctl restart php-fpm.service

它工作了!! 当然,在添加Remi仓库后。太好了! 谢谢你! :) 经过几年的Ubuntu和apt使用,现在使用Yum有点困难。 - Sergey Serov
注意:需要使用“sudo”运行命令。 - Sergey Serov
是的,你需要使用sudo,我在root用户下运行它们。 - Aris

1

这个错误是由于 PHP 没有可用的 PDO 导致的。

如果您在命令行上或者不是通过网站使用 PHP 相同的接口获取到该错误,那么您可能正在调用不同版本的 PHP 或者在检查 phpinfo() 时使用了不同的 php.ini 配置文件。

确保已加载 PDO,并且已经加载了适用于您的数据库的 PDO 驱动程序。


它按照上面的注释加载。 - Amanada Smith
2
+10 那真是太荒谬了,竟然有人投反对票……我也遇到过这种情况,升级 PHP 到 7.1 后发现 PDO 不可用......一些人的反应真的很奇怪。这是在 Stack 上的一种嗜好吗? - wpcoder
1
我认为很多人没有意识到这个网站是每个人的资源,而不仅仅是提问者的资源。并不是每个答案都会特别有用于提问者,但这并不意味着它们对其他人没有用。例如,这个答案就是我所需要的线索。已点赞,干杯。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接