php - PDO 对象 :could not find driver

标签 php mysql pdo

通常我可以在不发布的情况下找到我的问题的答案,但我已经查看了几十个关于相同错误消息的帖子——其中大多数建议安装 php-mysql 或 php7.3-mysql 或取消注释 php 中的 pdo 扩展.ini。我已经尝试了所有这些但没有成功。我怀疑这一定是某种类型的配置错误。 在 php 中连接到 MySQL 的旧方法工作得很好。 PDO 驱动程序无法正常工作。

可观的 nginx 日志、syslog 和 php7.3-fpm 的日志中都没有错误。

沮丧且没有想法,今天早些时候我尝试升级到 Debian bullseye,假设可能存在一些软件包不兼容问题,但这似乎也无济于事。这使我的 php 版本达到了 7.4(这似乎在服务器上的其他任何地方都运行良好)

有什么方法可以找到更多关于原因的信息吗?或者更详细的错误日志(除了我在浏览器中看到的以外,找不到任何其他错误日志)。我现在完全陷入了死胡同。

一些信息:

php -v
PHP 7.4.15 (cli) (built: Feb 20 2021 09:45:56) ( NTS )

mysql -V
mysql  Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)

nginx -v
nginx version: nginx/1.18.0

uname -a
Linux *****xx 5.10.0-5-cloud-amd64 #1 SMP Debian 5.10.24-1 (2021-03-19) x86_64 GNU/Linux

php -i | grep pdo
/etc/php/7.4/cli/conf.d/10-pdo.ini,
/etc/php/7.4/cli/conf.d/20-pdo_mysql.ini,
API Extensions => mysqli,pdo_mysql
pdo_mysql
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

apt install php-mysql
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
php-mysql is already the newest version (2:7.4+76).

apt list --installed | grep php
php-common/testing,now 2:76 all [installed,automatic]
php-fpm/testing,now 2:7.4+76 all [installed]
php-mysql/testing,now 2:7.4+76 all [installed]
php-xml/testing,now 2:7.4+76 all [installed]
php7.4-cli/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-common/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-fpm/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-json/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-mysql/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-opcache/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-readline/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
php7.4-xml/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]


apt list --installed | grep mysql
dovecot-mysql/testing,now 1:2.3.13+dfsg1-1 amd64 [installed]
mysql-apt-config/now 0.8.16-1 all [installed,local]
mysql-client/now 8.0.23-1debian10 amd64 [installed,local]
mysql-common/now 8.0.23-1debian10 amd64 [installed,local]
mysql-community-client-core/now 8.0.23-1debian10 amd64 [installed,local]
mysql-community-client-plugins/now 8.0.23-1debian10 amd64 [installed,local]
mysql-community-client/now 8.0.23-1debian10 amd64 [installed,local]
mysql-community-server-core/now 8.0.23-1debian10 amd64 [installed,local]
mysql-community-server/now 8.0.23-1debian10 amd64 [installed,local]
mysql-server/now 8.0.23-1debian10 amd64 [installed,local]
mysqltuner/testing,now 1.7.17-1 all [installed]
php-mysql/testing,now 2:7.4+76 all [installed]
php7.4-mysql/testing,now 7.4.15-5+deb11u1 amd64 [installed,automatic]
postfix-mysql/testing,now 3.5.6-1 amd64 [installed]

编辑: 相关功能码(from tiny tiny RSS's git)

```
function __construct() {
            ORM::configure(self::get_dsn());
            ORM::configure('username', Config::get(Config::DB_USER));
            ORM::configure('password', Config::get(Config::DB_PASS));
            ORM::configure('return_result_sets', true);
            if (Config::get(Config::DB_TYPE) == "mysql" && Config::get(Config::MYSQL_CHARSET)) {
                    ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . Config::get(Config::MYSQL_CHARSET)));
            }
    }
 public static function get_dsn() {
            $db_port = Config::get(Config::DB_PORT) ? ';port=' . Config::get(Config::DB_PORT) : '';
            $db_host = Config::get(Config::DB_HOST) ? ';host=' . Config::get(Config::DB_HOST) : '';
            if (Config::get(Config::DB_TYPE) == "mysql" && Config::get(Config::MYSQL_CHARSET)) {
                    $db_charset = ';charset=' . Config::get(Config::MYSQL_CHARSET);
            } else {
                    $db_charset = '';
            }

            return Config::get(Config::DB_TYPE) . ':dbname=' . Config::get(Config::DB_NAME) . $db_host . $db_port . $db_charset;
    }

   public function pdo_connect() : PDO {

            try {
                    $pdo = new PDO(self::get_dsn(),
                            Config::get(Config::DB_USER),
                            Config::get(Config::DB_PASS));
            } catch (Exception $e) {
                    print "<pre>Exception while creating PDO object:" . $e->getMessage() . "</pre>";
                    exit(101);
            }

            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            if (Config::get(Config::DB_TYPE) == "pgsql") {

                    $pdo->query("set client_encoding = 'UTF-8'");
                    $pdo->query("set datestyle = 'ISO, european'");
                    $pdo->query("set TIME ZONE 0");
                    $pdo->query("set cpu_tuple_cost = 0.5");

            } else if (Config::get(Config::DB_TYPE) == "mysql") {
                    $pdo->query("SET time_zone = '+0:0'");

                    if (Config::get(Config::MYSQL_CHARSET)) {
                            $pdo->query("SET NAMES " . Config::get(Config::MYSQL_CHARSET));
                    }
            }

            return $pdo;
    }


```

最佳答案

如果您最近刚刚获取了 ttrss 的副本,那么 Fox 似乎更改了配置中访问变量的方式。它现在使用环境变量,而不是使用定义的变量。例如

putenv('TTRSS_DB_TYPE=mysql');
putenv('TTRSS_DB_HOST=mydbhost');
putenv('TTRSS_DB_USER=trss');
putenv('TTRSS_DB_NAME=trss');
putenv('TTRSS_DB_PASS=supersecretpassword');

参见 https://git.tt-rss.org/fox/tt-rss/wiki/GlobalConfighttps://community.tt-rss.org/t/exception-while-creating-pdo-object-could-not-find-driver/4540

关于php - PDO 对象 :could not find driver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66896811/

相关文章:

php - 如何将 php ZipArchive 保存到 MySQL blob?

php - 使用关系数据库构建受 GitHub 启发的时间线的设计模式?

mysql - 循环遍历 MySQL 中可能的逗号分隔字符串

mysql - 在 Derby DB 中插入触发器之前

php - 使用用户输入获取包含准备好的语句的表

php - 我可以一次将一个 mysql 函数转换为 PDO 吗?

php - 一个 PHP 文件中的多个 MySQL 查询

php - 盗链保护

php - 连接表时得到重复的结果

php - 带有 php 的 Xampp 未运行