PHP PDO for Postgres未启用,即使在php.ini文件中启用



我正在使用带有命名占位符的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.ini 文件中注释回这些扩展名。它对我有用。在这篇文章中阅读更多关于

我也有同样的困难。我正在使用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的注释并重新启动了服务器

但同样的错误重复出现:内部服务器错误 500

3-我从 php 安装了 pgsql 软件包

apt-get install php7.3-pgsql
apachectl restart

完成此步骤后,错误500得到解决,但出现了RTC222提到的两个警告。顺便说一下,当我查看php错误.log文件时,我才看到。

为了解决这个问题,我做了几次搜索,但没有解决任何问题,直到我找到上述博客,该博客解释说其原因是(我引用(:

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

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

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

最新更新