【问题标题】:PHP Fatal error: Class 'PDO' not foundPHP致命错误:找不到类'PDO'
【发布时间】:2012-08-02 13:04:11
【问题描述】:
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 面板

【问题讨论】:

  • debug(PDO::getAvailableDrivers());的输出是什么
  • 似乎是服务级别支持问题?
  • “调试设置不允许访问此 url”将其添加到它自己的 php 文件中并运行它。
  • 您是如何获得 php_info 输出的?如果您从 CLI 执行此操作,则输出可能会有所不同,因为 cPanel 使用与 CentOS 不同的 PHP 二进制文件。
  • phpinfo();和 cli 都使用相同的二进制文件

标签: php mysql cakephp web-applications


【解决方案1】:

如果有人在 cPanel 中遇到此错误,请检查 cPanel 中的 PHP 版本类型。将其更改,alt-phpea-php。这个设置对我有用。

【讨论】:

    【解决方案2】:

    对于 Fedora 33,您可以按如下方式安装:

    安装

    dnf install php-pdo
    dnf install php-pdo_mysql
    

    重启 PHP

    systemctl restart php-fpm.service
    

    【讨论】:

      【解决方案3】:

      折腾了好久,终于解决了。检查您在 Cpanel 中的文件夹以查看是否有 php.ini 文件。如果是,请删除它,因为 Cpanel 将使用它自己的 php.ini

      【讨论】:

        【解决方案4】:

        我必须在 AWS EC2 Linux 实例(PHP 7.3 版)上运行以下命令:

        sudo yum install php73-php-pdo php73-php-mysqlnd
        

        【讨论】:

          【解决方案5】:

          有点晚了,但我发现了同样的问题,我在 PDO 前面用“\”修复了它

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

          【讨论】:

          • 您可以将 multi_query 用于您所描述的内容 (stackoverflow.com/a/22469722/2943403),但您不应该这样做。 multi_query() 不允许参数化。使用带有循环执行的单个准备好的语句,并随时获取新的 ID。
          • 修改这个:stackoverflow.com/a/25939954/2943403 以获取新的 ID,当您阅读这些 cmets 时告诉我,以便我删除它们。
          【解决方案6】:

          您可以通过执行以下命令来查找加载的配置文件,

           php -i | grep 'php.ini'
          

          然后添加以下行以更正 php.ini 文件

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

          然后重启网络服务器,

          service httpd restart
          

          【讨论】:

            【解决方案7】:

            如果你使用 php-fpm 模块运行 php,不要忘记运行命令 systemctl restart php-fpm!这将重新加载 php-fpm 模块。

            【讨论】:

            • 它看起来像评论,根本没有提供答案的答案。
            【解决方案8】:

            如果网络应用的当前工作目录中有php.ini 文件,也会发生这种情况。如果一个已被放置在那里以更改某些设置,它将覆盖全局设置。

            为避免此问题,请勿使用php.ini 文件更改设置;相反,您可以:

            • 在 vhost 声明中指定设置
            • 使用.htaccess 文件和php_flag (see here)
            • 使用.user.ini 文件 (see here)

            【讨论】:

            • 嗨阿拉斯泰尔,我稍微扩展了你的答案。希望没关系。 ;-)
            • 你能举例说明如何在 .htaccess 中添加 pdo 吗?谢谢!
            【解决方案9】:

            试试

             yum install php-pdo
             yum install php-pdo_mysql
            
             service httpd restart
            

            【讨论】:

            • @s4suryapal:在服务器 linux 的控制台命令行中运行。在窗口上,您可以取消注释行:php.ini 中的 extension=php_pdo_mysql.dll(例如:xampp、wamp、...)并重新启动 apache
            • 这个问题意味着他已经安装了 pdo(引用自 phpinfo),所以 -1。
            • 如何在 cent os 5.8 上安装 php pdo for oracle ?
            【解决方案10】:

            我在 GoDaddy 上遇到了同样的问题。我将extension=pdo.so 添加到php.ini,仍然无效。然后我脑子里只有一件事:权限

            在上传文件之前,杀死所有 PHP 进程(cPanel->PHP 进程)。

            问题在于 文件权限 设置为 0644 并且不可执行。您需要至少设置文件权限0755

            【讨论】:

              【解决方案11】:

              我使用库 PHP_PDO 解决了这个问题,因为我的托管服务提供商不接受我将 PDO 驱动程序安装到 apache 服务器的要求。

              【讨论】:

              • 嗨,你能指导我如何将库添加到 cpanel,因为我在共享主机上并且卡在这个中。
              • 谢谢兄弟你太棒了。工作 PDO... :)
              • 嗨,你能指导我如何将库添加到 cpanel,因为我在共享主机上!
              • Ramesh Kumar : 只需将 PHP_PDO 包含在您现有代码的开头
              【解决方案12】:

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

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

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

              如果它们不存在,只需将上面的行添加到 php.ini 文件的底部并保存即可。

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                • 这对我来说是这样的......我在一个命名空间类中,只是在PDO 前面添加一个`\`,正如其他地方所建议的那样不起作用-但这确实:)
                • 问题没有提到他正在使用命名空间。如果有人为所有其他客户类使用命名空间,这应该是可以接受的答案。因为他错过了代码中的某些东西use PDO 否则需要将正确的 PDO 版本库安装到他们的网络服务器中。
                • 这帮了我很多忙。谢谢你。如果有人想知道这也可以,因为 PDO 是 PHP 中的一个全局类。
                【解决方案14】:

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

                如果文件 Mysql.php 中包含“命名空间”语句,请使用 \PDO 代替 PDO - 这将告诉 PHP 查找全局类,而不是查找本地命名空间。

                【讨论】:

                • 那里没有命名空间,我又被难住了。
                • 我只是想知道这是否是一个编码不佳的脚本。我必须将 Cake 框架移动到 webroot 目录才能达到这个程度;/ 脚本是:freereviewscript.com/p/requirements
                【解决方案15】:

                此错误是由于PDO 不适用于 PHP。

                如果您在命令行上收到错误,或者不是通过您的网站用于 PHP 的相同界面,您可能会调用不同版本的 PHP,或者在检查 phpinfo() 时使用不同的 php.ini 配置文件.

                确保已加载 PDO,并且您的数据库的 PDO 驱动程序也已加载。

                【讨论】:

                • 按照上面cmets中的方法加载。
                • +10 投反对票真是太荒谬了...这正是发生在我身上的事...在将 PHP 升级到 7.1 PDO 后不可用...一些反对票的人真的很奇怪。这种爱好在堆栈中吗?
                • 我想很多人都没有意识到这个网站是每个人的资源,而不仅仅是 OP。并非每个答案都特别对 OP 有用,但这并不意味着它们对其他人没有用处。例如,这是我需要的线索。赞成。干杯。
                猜你喜欢
                • 2018-04-07
                • 2012-02-28
                • 2017-06-14
                • 2015-03-20
                • 2022-01-02
                • 2013-09-27
                相关资源
                最近更新 更多