【问题标题】:PHP PDO for Postgres not enabled even though enabled in php.ini file即使在 php.ini 文件中启用,也未启用 Postgres 的 PHP PDO
【发布时间】:2019-12-20 07:58:43
【问题描述】:

我正在使用带有命名占位符的 PDO 将记录插入 Postgres 数据库表,但出现错误。我没有打开 PHP 错误记录,所以我启用了它,进入 php_errors.log(我创建了那个新的日志文件)。

新的错误日志只显示两个启动警告:

[13-Aug-2019 17:26:08 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_pgsql' (tried: /usr/lib/php/20180731/pdo_pgsql (/usr/lib/php/20180731/pdo_pgsql: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/pdo_pgsql.so (/usr/lib/php/20180731/pdo_pgsql.so: undefined symbol: pdo_parse_params)) in Unknown on line 0

[13-Aug-2019 17:26:08 UTC] PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0

文件 /usr/lib/php/20180731/pdo_pgsql.so 在那里,尽管警告说什么。在我的 php.ini 文件中,以下行未注释:

extension=pdo_pgsql
extension=pgsql

我认为这就是启用 pdo 所需要做的一切。但是,在我的 phpinfo 网页中没有 pdo 条目,应该有,所以看起来 pdo 不存在,即使 pgsql 至少可以登录到 Postgres 数据库。

我确实知道 php 正在使用 Postgres,因为当我在没有数据库插入代码的情况下运行脚本时(只是登录到 Postgres),开发控制台会显示一条成功消息(“成功连接到数据库”)。

我的问题是:我还需要做什么才能启用 pdo?

这里是完整的脚本文件,虽然这个问题可能不需要它。正如我所说,如果没有下面的 try-catch 块,开发控制台会报告成功登录 Postgres 数据库,但是当我使用 pdo 记录插入代码启用 try-catch 块时,它会失败,显然是因为未启用 pdo。

<?php
echo 'Hello ' . htmlspecialchars($_POST["firstname"]) . '!' ;
$dsn = vsprintf('pgsql:host=%s;port=%s;dbname=%s;user=%s;password=%s',  [
    'host' => 'xx.xxx.xxx.xxx',
    'port' => '5432',
    'dbname' => 'dbname',
    'user' => 'username',
    'password' => 'password',
]);

echo $dsn;
echo PHP_EOL;

try{
 // create a PostgreSQL database connection
 $conn = new PDO($dsn);

 // display a message if connected to the PostgreSQL successfully
 if($conn){
 echo "Connected to the database successfully!";
 }
}catch (PDOException $e){
 // report error message
 echo $e->getMessage();
}

$fields = array('date', 'email', 'firstname', 'lastname', 'password',   'comments', 'sendupdates');
$fieldlist = implode(',', $fields);

echo $fieldlist;
echo PHP_EOL;

    $datefield = $_POST['datefield'];
    $email_field = $_POST['email_field'];
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $password = $_POST['password'];
    $comments = $_POST['comments'];
    $custom_checkbox = $_POST['custom_checkbox'];

echo $datefield;
echo PHP_EOL;
echo $email_field;
echo PHP_EOL;
echo $firstname;
echo PHP_EOL;

echo $lastname;
echo PHP_EOL;
echo $password;
echo PHP_EOL;
echo $comments;
echo PHP_EOL;
echo $custom_checkbox;
echo PHP_EOL;


try {

    $datefield = $_POST['datefield'];
    $email_field = $_POST['email_field'];
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $password = $_POST['password'];
    $comments = $_POST['comments'];
    $custom_checkbox = $_POST['custom_checkbox'];

    $data = [
        'date' => $datefield,
        'email' => $email_field,
        'firstname' => $firstname,
        'lastname' => $lastname,
        'password' => $password,
        'comments' => $password,
        'checkbox' => $custom_checkbox,
    ];

    $sql = "INSERT INTO psq01 (date, email, firstname, lastname, password, comments, sendupdates) VALUES (:date, :email, :firstname, :lastname, :password, :comments, :checkbox)";

    $stmt= $pdo->prepare($sql);
    $stmt->execute($data);

} catch (PDOException $e) {
    error_log($e->getMessage());
}

$conn = null;

?>

再说一次,我还需要什么来启用 PDO?我正在使用 Ubuntu 18.04。

感谢您对此的任何帮助。

【问题讨论】:

  • 该错误通常是由于使用了错误的扩展版本造成的。每个扩展都必须针对将加载它的兼容 PHP 版本进行编译。
  • 不再重复,因为我之前做过 apt-get install php-pgsql。我会再试一次。
  • 对于@Vahid Amiri——通常的方法是 apt-get install php-pgsql——有什么方法可以指示版本吗?我正在使用 PHP 7.3。
  • @RTC222 如果您使用 64 位 PHP,请确保将扩展程序编译为 64 位二进制文​​件。即使错误可能看起来与错误的扩展目录有关,也可能与其他事情有关。

标签: php postgresql pdo


【解决方案1】:

您应该尝试在 php.ini 文件中注释掉这些扩展。它对我有用。阅读更多关于this post

我也有同样的困难。我正在使用 Debian 10、PostgreSQL 12、Apache 2.4.38 和 php7.3。按照大多数网站上的说明进行操作:

1-我安装了php

apt-get install php libapache2-mod-php

在尝试运行我的应用程序时,出现内部服务器错误 500

2- 我编辑了 php.ini 文件,取消注释扩展 pdo_pgsql 和 pgsql 并重新启动服务器

但同样的错误再次出现:Internal Server Error 500

3-我从php安装了pgsql包

apt-get install php7.3-pgsql
apachectl restart

经过这一步解决了500错误,但是出现了RTC222提到的两个警告。顺便说一句,我只在查看 php error.log 文件时才看到。

为了解决这个问题,我进行了几次搜索,但都没有解决任何问题,直到我找到了上述博客,其中解释了导致此问题的原因(我引用):

"在 PHP 中加载大多数扩展有两种方法。一种是通过 将扩展直接编译到 PHP 二进制文件中。另一个是通过 通过 ini 文件动态加载共享扩展。错误 表明动态扩展正在通过 .ini 文件加载,甚至 尽管它们已经编译到 PHP 二进制文件中。 "

4- 我取消注释 php.ini 文件中感兴趣的扩展名并重新启动服务器,一切都得到了满意的解决。

我希望这对某人有所帮助。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2014-09-19
  • 2012-02-08
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多