Debian GNU / PHP+PostgreSQL / 動作確認


Debian GNU/PHP+PostgreSQL

変な書き込みがあるのでコメントも編集も出来ないようにしました。2008.6.24

PHP+PostgreSQL動作確認

例によって、Apache + PHP + PostgreSQL laboratoryphpとPostgreqlを参考にしてやります。Debian GNU/PHP+PostgreSQLリモートからのアクセスにあるlibpq.dllはクライアントであるWindowsマシンにインストール済*1みです。

テスト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

テスト2 ソースをいじってgrantoを与える

ソースを以下のように変更して再度トライ!

$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ですのでその関係かもしれません。

  1. ってことでWebからのアクセスを可能にする。
    Linuxで自宅サーバ>PostgreSQL の導入を参考にしてWebからのアクセスを可能にします。
    まずはapacheのユーザーと同じ名前のwww-dataというpostgresqlのユーザーを作ります。
    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 USER
    PostgreSQLはハイフン”-”の付くユーザーは作成できないとありますが、どうやら'と'で囲むと出来ますどうやらダブルクォーテーション囲むと出来ます。db作成の許可などは特に与える必要は無し。

    後で気が付いたのだが、

    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

ってことになります。 :d

改訂版 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

テスト3 ソースをいじる

/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");

としても結果は同じ。

テスト4 /etc/php4/apache/php.iniを見直す

  1. enable_dl=On 確認OK!!
  2. extension_dir=/usr/lib/php4/20010901をextension=pgsql.so の上に追記する。

結果は変わらず :(


訳分からん

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

ってことでインスコできません。

phpinfo.jpg

コレをみるとwithout-pgsqlって書いてありますが、大丈夫なのだろうか? でもpg_connectはできてるし...

  • サンクス。「問題解決!」のおかげで1日の苦労で済みました -- auu? 2005-04-22 16:58:41 (金)

問題解決!

試しにソースを以下のように書き直してみました。

$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に直します。すると...。

dblist.jpg

おぉ!成功だぁ〜。やったー! 関数を古いバージョンにしたらちゃんと出来たってことは...? そうです、ThinkPad?にインストールされたphp4のバージョンは4.1.2。それに対してソースはPHP4.2以降のバージョンで書かれていました。 2週間も苦労したのに何だったんだ?! ってオレがちゃんと確認してなかったのが行けなかったんだけど。 :d

ってことでPHP PostgreSQL 関数 -Manualはちゃんと目を通しましょう。

まとめ

  1. Debianの場合、php4の後にPostgreSQL関係をインストールしてもOK!! PHP+PostgreSQLはちゃんと動作します。*3
  2. apacheユーザーと同じwww-dataというユーザーcreateuserで作れば、wwwというユーザーを作くったり、/etc/postgresql/pg_ident.confを書き直す必要もありません。ワタシはdropuserしました。
  3. pg_connectもwww-dataユーザーを作ったのなら
    $con = pg_connect("dbname=yasu");
    とだけすればOK!!
  4. ただしgrantだけは以下のように
    yasu=> grant all on meibo to "www-data";
    実行しておかないと駄目です。(この場合すべての権限をwww-dataに与えています)


*1 libpq.dllはブラウザを通してPostgreSQLにアクセスする場合は必要ないようです
*2 filedblist1.php
*3 当たり前だが、apacheの再起動は必要