phpPgAdmin 4.2.1でログインできない場合の解決方法

別のマシンに入れてある phpPgAdmin 4.2.1を使用して、DBサーバのPostgreSQL 7.4.18 に接続しようとしたのですが、どうしてもログイン出来ないのでいろいろと調べてみました。

一般的には設定ファイルのパラメータが間違っていることが多いみたいだけど、今回はちょっと違うみたいでした。
ググっても有益な情報が見つからなかったので、ここにメモしておきます。


【使用環境】
■DBサーバ
OS:CentOS 4.5
DB:PostgreSQL 7.4.18
IP:192.168.1.10

■WEBサーバ
OS:FredoraCore 3
PHP:PHP 4.3.14
Web:Apache 2.0.53
AP:phpPgAdmin 4.2.1


【現象】
phpPgAdmin からログイン出来ない。


【原因】
試しに、簡単なPHPを作成してphpPgAdmin が生成している、ログイン時のパラメータを調査し、同じパラメータで接続出来るかを試したところ、エラーとなってしまいました。

今回のログイン出来ない問題の原因はログイン時のpg_pconnectのパラメータに問題があるみたいでした。
pg_pconnectのパラメータに"sslmode"を指定すると下記エラーが発生していました。

PostgreSQL server: invalid connection option "sslmode"

ググったけど、このエラーに関しては有益な情報がみつからずでした。PostgreSQL7 だと発生するみたいだけど、本当かはわかりません。


【対策】
phpPgAdmin のパラメータ設定では、接続情報にsslmode="xxxxxx"を必ず引数として渡しているようだったので、いくらconfig.inc.php で設定を変えてもダメな様でした。

仕方がないので、無理矢理な方法ですが・・・
ソースみたら、adodb-postgres64.inc.php に接続処理が記述されてたので、そいつを変更してやりました。

adodb-postgres64.inc.phpの場所の例は次の通りです。
/phpPgAdmin/libraries/adodb/drivers/adodb-postgres64.inc.php


でソース内の"_connect 関数"が接続処理だったので、
668,669行目にあるsslmodeのパラメータを生成している以下のコードをコメントアウトしました。
(バージョンによっては行数は異なると思われますが)


■修正前

if (isset($host[2])) $str .= " sslmode=".adodb_addslashes($host[2]);
else if (!empty($this->sslmode)) $str .= " sslmode=".$this->sslmode;


■修正後

//if (isset($host[2])) $str .= " sslmode=".adodb_addslashes($host[2]);
//else if (!empty($this->sslmode)) $str .= " sslmode=".$this->sslmode;


こんな無理矢理な方法ですが、一応これでログインする事ができました。
phpPgAdminは使い始めたばかりで、あまり良くわかりませんがもしかすると不具合がでるかもしれませんので、変更する場合は各自で責任をもって修正して下さいね☆





しかし、何故sslmodeは使用できないんだろう?
こっちの問題解決をすべきだとおもわれます。
誰か知ってました教えて下さい。


最後にエラーが発生し接続出来なかったソースを貼り付けて起きます。
このPHPソースを環境にあわせて修正した後に、
実行するとsslmodeのエラーが発生すれば、今回の問題かどうか確認出来ると思います。

<?php
$con_str = "host='192.168.1.10' port=5432 sslmode='prefer' user='testuser' password='' dbname='testdb'";
$con    = pg_connect($con_str);  // データベースに接続
?>