変な書き込みがあるのでコメントも編集も出来ないようにしました。2008.6.24
例によって、Apache + PHP + PostgreSQL laboratoryのphpとPostgreqlを参考にしてやります。Debian GNU/PHP+PostgreSQLのリモートからのアクセスにあるlibpq.dllはクライアントであるWindowsマシンにインストール済*1みです。
テストのためのソースをDL*2してきて、/var/www/以下に保存。さらに自分の環境に合わせるため下記のように変更します。
$con = pg_connect("dbname=yasu user=yasu host=192.168.1.155"); $rs = pg_query($con,"select * from meibo");
クライアント=Windowsマシンでアクセスすると結果は以下の通り
Warning: Unable to connect to PostgreSQL server: FATAL 1: No pg_hba.conf entry for host 192.168.1.155, user yasu, database yasu in /var/www/dblist1.php on line 14 Fatal error: Call to undefined function: pg_query() in /var/www/dblist1.php on line 15
ソースを以下のように変更して再度トライ!
$con = pg_connect("dbname=yasu user=yasu");
今度は
Warning: Unable to connect to PostgreSQL server: FATAL 1: IDENT authentication failed for user "yasu" in /var/www/dblist1.php on line 14 Fatal error: Call to undefined function: pg_query() in /var/www/dblist1.php on line 15
IDENT authentication failedってことはどういったことなのでしょう? Debianの場合apacheのユーザーとグループはwww-dataですのでその関係かもしれません。
yasu@debian:~$ su Password: debian:/home/yasu# su - postgres postgres@debian:~$ createuser Enter name of user to add: 'www-data' Shall the new user be allowed to create databases? (y/n) n Shall the new user be allowed to create more new users? (y/n) n CREATE USERPostgreSQLはハイフン”-”の付くユーザーは作成できないとありますが、
後で気が付いたのだが、
Enter name of user to add: 'www-data'とするとwww-dataというユーザーではなく'www-data'というユーザーができてしまうようだ。さらにさらに
postgres@debian:~$ createuser Enter name of user to add: "www-data"とすると
createuser: creation of user "\"www-data\"" failedとなってしまい
postgres@debian:~$ createuser "www-data"とすればwww-dataというユーザー("www-data"ではない)が作成できますです。なんで?
あとはyasuというdbにwww-dataユーザーもアクセスできるようにする。
postgres@debian:~$ exit logout debian:/home/yasu# exit exit yasu@debian:~$ psql yasu Welcome to psql, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit yasu=> grant all on meibo to 'www-data'; ERROR: parser: parse error at or near "'"
ありり、www-dataというユーザーは作成できたが、許可を与えられないです。
よってこの件も
yasu=> grant all on meibo to www-data; ERROR: parser: parse error at or near "-" yasu=> grant all on meibo to "www-data"; GRANTってことになります。
改訂版 Debian GNU/Linux 徹底入門 potato対応 情報ページのQ&Aに/etc/postgresql/pg_ident.confを直せば出来ると書いてあるのでそれにしたがって
debian www-data www
の一行を書き加える。念のため/etc/init.d/postgresql restartとしてPostgreSQLを再起動。次に先ほどwww-dataというユーザーを作成したのと同様にwwwというユーザーを作成する。
postgres@debian:~$ createuser Enter name of user to add: www Shall the new user be allowed to create databases? (y/n) n Shall the new user be allowed to create more new users? (y/n) n CREATE USER
/var/www/dblist1.phpを以下のように修正
$con = pg_connect("dbname=yasu user=www");
やはり先ほど同様にwwwユーザーにmeiboへのアクセスを許可する。
yasu=> grant all on meibo to www;
結果は以下の通り
Warning: Unable to connect to PostgreSQL server: FATAL 1: IDENT authentication failed for user "www" in /var/www/dblist1.php on line 14 Fatal error: Call to undefined function: pg_query() in /var/www/dblist1.php on line 15
/var/www/dblist1.phpを以下のように修正
$con = pg_connect("dbname=yasu user=www host=192.168.1.155");
結果は...、おぉ! ちょっと変化がありました。
Fatal error: Call to undefined function: pg_query() in /var/www/dblist1.php on line 15
先ほどまではdb yasuにアクセス出来ませんでしたが、hostを明示してやるとアクセスできました。しかしクエリが実行できません
試しにテスト1のようにソースをもどして
$con = pg_connect("dbname=yasu user=yasu host=192.168.1.155");
としても結果は同じ。
結果は変わらず
http://selena.homelinux.net/~tetsu/memo/msg00880.htmlをみるとpostgresql-devって言うのが必要らしいが、
Sorry, but the following packages have unmet dependencies: postgresql-dev: Depends: libssl-dev but it is not going to be installed E: Sorry, broken packages
ってことでインスコできません。
コレをみるとwithout-pgsqlって書いてありますが、大丈夫なのだろうか? でもpg_connectはできてるし...
試しにソースを以下のように書き直してみました。
$rs = pg_exec($con,"select * from meibo");
pg_execはpg_queryに変更される前の関数です。すると結果は...
Fatal error: Call to undefined function: pg_num_rows() in /var/www/dblist1.php on line 16
おぉ!変化が見られました。アレ?こ、これって...。pg_num_rowsも古い関数pg_numrowsに直します。すると...。
おぉ!成功だぁ〜。やったー! 関数を古いバージョンにしたらちゃんと出来たってことは...? そうです、ThinkPad?にインストールされたphp4のバージョンは4.1.2。それに対してソースはPHP4.2以降のバージョンで書かれていました。 2週間も苦労したのに何だったんだ?! ってオレがちゃんと確認してなかったのが行けなかったんだけど。
ってことでPHP PostgreSQL 関数 -Manualはちゃんと目を通しましょう。
$con = pg_connect("dbname=yasu");とだけすればOK!!
yasu=> grant all on meibo to "www-data";実行しておかないと駄目です。(この場合すべての権限をwww-dataに与えています)