PDO object:could 找不到驱动程序
PDO object:could not find driver
通常我无需发帖就能找到问题的答案,但我已经查看了几十篇关于相同错误消息的帖子 - 大多数帖子建议安装 php-mysql 或 php7.3-mysql 或取消注释 php.ini 中的 pdo 扩展。我已经尝试了所有这些但没有成功。我怀疑这一定是某种类型的配置错误。
在 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/GlobalConfig and https://community.tt-rss.org/t/exception-while-creating-pdo-object-could-not-find-driver/4540
通常我无需发帖就能找到问题的答案,但我已经查看了几十篇关于相同错误消息的帖子 - 大多数帖子建议安装 php-mysql 或 php7.3-mysql 或取消注释 php.ini 中的 pdo 扩展。我已经尝试了所有这些但没有成功。我怀疑这一定是某种类型的配置错误。 在 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/GlobalConfig and https://community.tt-rss.org/t/exception-while-creating-pdo-object-could-not-find-driver/4540