PHPエラー「Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: fe_sendauth: no password supplied」の原因と解決方法

PHPのpg_connect関数でCentOS 5のPostgreSQL 8.1環境に接続をしようとすると、

Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: fe_sendauth: no password supplied in /var/www/html/test.php

といったエラーが発生して接続できない時がある。

エラーメッセージに「no password supplied」とあるため、「パスワードが入力されていないから入力しなさい」という意味だろうから、パスワードを入力すればエラーは解消しそうに思ったが、困った。

パスワードは何も設定していないからだ。

《エラーとなったPHPプログラムを確認》
$dbconn = pg_connect("host=localhost dbname=test_database user=postgres password=") or die("Could not connect");

《PostgreSQLの設定ファイルを確認》※初期設定ではなく、過去に設定を変えている。たぶん。
/var/lib/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5

ここで気付いた。

PHPプログラムで、「host=localhost」と指定しているので、IPv4での接続になる。

IPv4のパスワードのセキュリティ設定は、「md5」になっている。

「md5」を「trust」に変更し、PostgreSQLを再起動してみると、エラーは解消された。

この方法でもいいかもしれないが、別の解決方法がないか考えてみる。

すると、「Unix domain socket」(ユニックスドメインソケット)での接続は、「md5」になっておらず、「trust」になっていることに気付いたので、PHPのpg_connect関数で接続する際に、ユニックスドメインソケットを使用すれば、エラーにならなかったのでは、と思い至る。
pg_hba.confの設定を基に戻す。

php.netのマニュアルを見ていると、pg_connect関数でユニックスドメインソケットで接続するには、いくつか方法があるようだったが、一番簡単な方法をとることにした。

host=localhostを削除すればよい。

《修正後のPHPプログラム》
$dbconn = pg_connect("dbname=test_database user=postgres password=") or die("Could not connect");
これで、ユニックスドメインソケットで接続できるようになり、PHPエラーが解消された。

※もちろん、セキュリティを考慮して、データベースにきちんとパスワードを設定していれば、「no password supplied」というエラーは発生しないであろうから、パスワードをかける、という対応が一番よい解決方法であろうと思う。

前へ

PHPでユーザーエージェントを取得する方法

次へ

PHPエラー「Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket」の原因と解決方法