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」というエラーは発生しないであろうから、パスワードをかける、という対応が一番よい解決方法であろうと思う。