php - 在本地主机上使用 pdo 连接到 postgresql 时出现问题 (08006)

标签 php postgresql pdo

我已经设置了一个测试服务器并安装了 PHP 5.4(带 Nginx 的 zend 服务器)和 postgresql 9.1。

我正在尝试使用以下代码连接到 postgresql 数据库:

define('DB_TYPE', 'pgsql');
define('DB_HOST', 'localhost');
define('DB_PORT', 5432);
define('DB_NAME', 'rockprofile');
define('DB_USERNAME', 'rockprofile');
define('DB_PASSWORD', 'PASSWORD');

$dsn = DB_TYPE . ':dbname=' . DB_NAME . ';host=' . DB_HOST . ';port=' . DB_PORT;

try {
   $db = new PDO($dsn, DB_USERNAME, DB_PASSWORD);
} catch (PDOException $e) {
   echo $e->getMessage();
   print_r($e->getTrace());
}

然而,这会生成以下内容:

SQLSTATE[08006] [7] FATAL: Ident authentication failed for user "rockprofile"

Array (
   [0] => Array (
       [file] => /usr/share/nginx/inc/config.php
       [line] => 24
       [function] => __construct
       [class] => PDO 
       [type] => -> [args] => Array (
            [0] => pgsql:dbname=rockprofile;host=localhost;port=5432
            [1] => rockprofile
            [2] => PASSWORD ) )
   [1] => Array ( [file] => /usr/share/nginx/bands/index.php
       [line] => 2
       [args] => Array (
            [0] => /usr/share/nginx/inc/config.php )
            [function] => include ) ) 

如您所见,我正在使用本地主机。我知道 dsn 是正确的,包括用户名和密码,因为如果我用本地 192 IP 替换 localhost,它就可以工作。怀疑是postgresql配置的问题,目前内容如下:

local   all             all                                    peer
host    all             all            127.0.0.1/32            ident
host    all             all            ::1/128                 ident
host    all             all             192.168.1.0/24          md5

在搜索时,有人似乎通过将 ident 更改为信任上述配置来解决此问题,但这对我的情况没有帮助。

这可能是我需要添加的一些简单内容,但目前搜索似乎没有结果。谁能告诉我如何纠正这个问题。

*-----EDIT-----*

根据 Daniel Vérité 对修复问题的回应,需要将 ident 更改为 MD5。我个人不得不为 IPv4 和 IPv6 条目更改此设置。

local   all             all                                    peer
host    all             all            127.0.0.1/32            md5
host    all             all            ::1/128                 md5
host    all             all             192.168.1.0/24          md5

最佳答案

参见 http://www.postgresql.org/docs/9.1/static/auth-methods.html :

The ident authentication method works by obtaining the client's operating system user name from an ident server and using it as the allowed database user name (with an optional user name mapping)

ident 身份验证方法并不真正适合来自 Web 服务器的连接,因为 Web 进程在一个帐户下运行,通常是 www-data 或一些具有与数据库帐户没有关系(在您的情况下为 rockprofile)。

由于您希望通过密码进行身份验证,因此请在 pg_hba.conf 中将其替换为 md5 并重新加载或重新启动 PostgreSQL。

您也可以更改您的密码,因为它在跟踪中以明文形式出现,从而使您在代码中的替换工作无效。

关于php - 在本地主机上使用 pdo 连接到 postgresql 时出现问题 (08006),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724664/

相关文章:

php - 在 Laravel 代码中运行 'php artisan migrate:fresh'

PostgreSQL:配置选项的 JSON 列或一对多表

mysql - 使用 INNER JOIN 更新的查询语法错误

php - 如何在 PDO 中使用 SELECT IFNULL?

php - 获取数组中的最后一个值

php - Delphi IdHTTP.get 和 PHP file_get_contents 显示相同 URL 的不同文本

database - 如何将用户创建的符号数学存储在数据库中?

database - 查询在触发后没有结果数据的目的地

javascript - 我该怎么做才能在每次插入数据时或按时间间隔更新我的 chartjs?

php - Sonata-admin 无法修改具有继承的类