【问题标题】:php pdo for Postgres: "could not find driver"Postgres 的 php pdo:“找不到驱动程序”
【发布时间】:2019-10-17 21:48:56
【问题描述】:

我在新的 Ubuntu 18.04 服务器上为 Postgres 安装了 php,但我遇到了 php 问题。以下是我的 php 7.3 安装步骤:

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php]
sudo systemctl restart apache2

安装 PHP 7.3 后,我安装了 pgsql。

sudo apt install php-pgsql
sudo service apache2 reload

接下来我编辑了 /etc/php/7.3/apache2 中的 php.ini 文件,并从以下几行中删除了分号:

extension=pdo_pgsql
extension=pgsql

我保存了文件并 sudo systemctl restart apache2.

最后我启用了模块:

sudo phpenmod -v 7.3 pgsql
sudo phpenmod -v 7.3 pdo_pgsql
sudo systemctl restart apache2

然后我创建了一个脚本来使用 pdo 登录到我的 Postgres 数据库(登录凭据在此处替换为占位符值。)

<?php

$params = [
    'host' => '[IP Address]',
    'user' => '[username]',
    'pwd' => '[password]',
    'db' => '[dbname]'
];

$dsn = sprintf('pgsql:host=%s;dbname=%s;user=%s;password=%s',
    $params['host'],
    $params['db'],
    $params['user'],
    $params['pwd']);

try {
    $dsn = sprintf('pgsql:host=%s;dbname=%s;unix_socket=%s',
        $params['host'], $params['db'], $params['sock']);
    $opts = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
    $pdo = new PDO($dsn, $params['user'], $params['pwd'], $opts);
} catch (PDOException $e) {
    echo $e->getMessage();
} catch (Throwable $e) {
    echo $e->getMessage();
}

?>

但 Firefox 开发控制台回显:“找不到驱动程序。”

一个线索是 php 7.3 在 /etc/apache2/mods-available 中,但它不在 /etc/apache2/mods-enabled 中,这表明它没有启用。但是当我尝试 phpenmod -v 7.3 php7.3.conf 时,我得到:警告:模块 php7.3.conf ini 文件在 /etc/php/7.3/mods-available 下不存在。

我已经对此进行了大量研究,这些都是要遵循的步骤。大部分研究都是针对 MySQL 的,但这对 PDO 来说并不重要。

感谢您对我收到“找不到驱动程序”消息的原因提出任何想法。

更新:

我创建了一个脚本来运行 phpinfo():

<?php
ob_start();
phpinfo();
$info = ob_get_clean();
echo $info;
?>

但它只返回 html 代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}
a:link {color: #009; text-decoration: none; background-color: #fff;}
a:hover {text-decoration: underline;}
table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;}
.center {text-align: center;}
.center table {margin: 1em auto; text-align: left;}
.center th {text-align: center !important;}
td, th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;}
h1 {font-size: 150%;}
h2 {font-size: 125%;}
.p {text-align: left;}
.e {background-color: #ccf; width: 300px; font-weight: bold;}
.h {background-color: #99c; font-weight: bold;}
.v {background-color: #ddd; max-width: 300px; overflow-x: auto; word-wrap:  break-word;}
.v i {color: #999;}
img {float: right; bo…
jquery.min.js line 2 > eval:12:21
?

但这不是我所期望的。

【问题讨论】:

  • 基于您看到的驱动程序错误消息,而不是 PHP 代码文本,Apache 似乎正在加载 PHP。听起来您可能安装了多个版本的 PHP,而 Apache 加载了与 7.3 不同的版本。建议查看How to check the presence of php and apache on ubuntu server through ssh 看看是否有帮助。即:a2enmod php7.3
  • 删除输出缓冲,只将&lt;?php phpinfo(); exit; 放入info.php 并在浏览器中导航到它。您还需要使用 a2dismod php7.2 来禁用 PHP 7.2,然后使用 a2enmod php7.3 在 Apache 中切换到 php 7.3。
  • php5 的有趣冲突然后你需要做a2dismod php5
  • 是的,你的DSN 里面有unix_socket,而你的params['socket'] 不见了,在不知道你的数据库服务器是如何配置的情况下无法解决这个问题。 (端口或套接字)
  • 您的 DSN(数据库源名称)是 pgsql:host=%s;dbname=%s;unix_socket=%s 请参阅:php.net/manual/en/ref.pdo-pgsql.connection.php 所以您可以将其更改为 pgsql:host=%s;dbname=%s;user=%s;password=%s

标签: php postgresql ubuntu pdo


【解决方案1】:

根据我们的谈话,问题是由于安装了多个版本的 PHP 而 Apache 加载的 PHP (7.2) 版本与预期的 PHP 7.3 不同。

要解决此问题,请运行以下命令:

sudo a2dismod php7.2
sudo a2enmod php7.3

这将禁用 Apache 加载 php7.2 并改为加载 php7.3。


对于您的 DSN(数据源名称),您当前的配置使用 unix_socket,这似乎不是 postgresql DSN 的有效选项。此外,缺少用于 unix_socket 参数的$params['socket']

更多详情见:https://www.php.net/manual/en/ref.pdo-pgsql.connection.php

如果数据库服务器正在侦听默认端口(5432),您可以使用:

try {
    $dsn = vsprintf('pgsql:host=%s;port=%s;dbname=%s;user=%s;password=%s', [
        'host' => '[IP Address]',
        'port' => '5432',
        'dbname' => '[dbname]',
        'user' => '[username]',
        'password' => '[password]',
    ]);
    $pdo = new PDO($dsn);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
} catch (Throwable $e) {
    echo $e->getMessage();
}

DSN 应生成:https://3v4l.org/aFKAW

pgsql:host=[IP Address];port=5432;dbname=[dbname];user=[username];password=[password]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2016-08-05
    • 2017-11-07
    • 2016-03-26
    相关资源
    最近更新 更多