使用localhost上的pdo连接到postgresql的问题(08006)

时间:2013-07-18 13:21:01

标签: 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 ) ) 

正如您所看到的,我正在使用localhost。我知道dsn是正确的,包括用户名和密码,因为如果我用本地192替换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更改为trust来解决此问题,但这对我的情况没有帮助。

这可能是我需要添加的简单内容,但目前搜索似乎毫无结果。任何人都可以告诉我如何纠正这一点。

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

根据DanielVé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

1 个答案:

答案 0 :(得分:3)

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

  

ident身份验证方法通过获取客户端来工作   来自ident服务器的操作系统用户名并将其用作   允许的数据库用户名(带有可选的用户名映射)

ident身份验证方法并不适合来自Web服务器的连接,因为Web进程在一个帐户下运行,通常是www-data或与数据库帐户无关的一些帐户({在你的情况下{1}}。

由于您希望通过密码进行身份验证,请将其替换为rockprofile中的md5,然后重新加载或重新启动PostgreSQL。

此外,您可以更改密码,因为它在跟踪中显示为明确,否定了代码中的替换工作。