postgreSQLをWindowsでPHPで使う
メモ:
WindowsでPostgreSQL(ぽすぐれ)を動かしPHPからアクセスする
本にある通りでは全く動かない。9.0ではあれが無いこれが無いというエラーが
入れても入れても数珠つなぎで、最後にはdllのバージョンが合わなくなるのか
「除数###がXXX.dllから見つかりませんでした」といったエラーになる。
8.4を使う。
8.4であれば起動、停止などもコマンドプロンプトでなく画面から
行うコマンドが用意されている。
### 2012/5/3
Windows7-64bitに9.1.3を導入(ダウンロードインストールした)。
スタックビルダでXAMPPとApacheの競合と思われるインストールエラーが出たが
無事動いた。
postgre-shellも動いた。起動時にClient Encodingを聞いてくるようになった。しかもデフォルトがSJIS
なのでWindowsでの作業にはありがたい。
管理ツールも良くできている。
しかし、Windows7-64bitではxampp1.7.7のphpがまとな速度では動かない。
まったく同じものをWindows-XP/32bit環境に置くと普通に動く。
wampというライブラリだと
phpは動くが今度はPEARがまともに入らず、なによりpostgresqlの動作は絶望的な状態。
phpにあるlibpq.dllをC:\WINDOWS\system32\にコピーする。<--必須
多分必要なのはlibpq.dllだけだと思うが9.0の作業で何か
いじった可能性もある。libintl-8.dllは入れたが外した。
libpq.dllを入れたら、ControlPanelは[exit]で一旦抜け、改めて起動しなおす必要がある。
php.iniで
extension=php_pgsql.dll
を有効にする。
DBの追加、サービスの起動などはコマンドプロンプトから ではなく、pgAdminから行う。
アンインストール時の注意
アンインストールした後はコマンドプロンプトで
net user postgres /delete
でアカウントの削除を行う必要がある。
もし「システムエラー 5が発生しました。アクセスが拒否されました」と
なるようなら、
スタート->プログラム->アクセサリ->コマンドプロンプト
を右クリックし
管理者として実行
を選び、管理者としてコマンドプロンプトを実行すること。
アンインストールでは古い設定が残り次のインストールが失敗することがある。
フォルダが残っている場合これも削除しなくてはならない
C:\Program Files\PostgreSQLそれで終わりと思うと甘い。
C:\Users\にpostgresユーザ情報が残ったままとなるので、このフォルダも 消さなければならない。
クリック一発インストール、アンインストールなどという記述に騙されてはいけない。
postgreSQLはとんでもなく面倒なのだ!
SQL手作業
手作業でSQLアクセスを行うにはSQLShellを起動する。
Server [localhost]: Database [postgres]: Port [5432]: Username [postgres]: psql (8.4.1) "help" でヘルプを表示します. postgres=# CREATE TABLE testTable (name text PRIMARY KEY,info text); NOTICE: CREATE TABLE / PRIMARY KEY縺ッ繝・・繝悶Ν"testTable"縺ォ證鈴サ咏噪縺ェ繧、 CREATE TABLE繧ケ"testTable_pkey"繧剃ス懈・縺励∪縺・ postgres=# INSERT INTO testTable (name,info) VALUES('abc','xyz'); INSERT 0 1 postgres=# SELECT * FROM testTable; name | info ------+------ abc | xyz (1 行) postgres=#この例ではルート権限のpostgresでそのまま作業をしているが、 本来はCREATE ROLEを用いて一般ユーザを作成し、作業する必要がある。
んが、なぜかCREATE ROLEで作成したユーザは「ログインすることが許されていません」 というエラーになる。
SQL SHELLをWINDOWSで使う場合次のコマンドで文字コードを変更しないと上の例のように文字化けする。
postgres=# \encoding SJIS
テーブル一覧を出すのは\d(逆スラッシュd)。
SHOW TABLES;なんてものは用意されていない。ネットで検索すると、とんでもなく
複雑なSQL文で表示させる方法が出てくる。
PHPでSELECTしてみる。
テーブルtestTableはnameとinfoの2つのフィールドからなっているとして、次のように name指定でinfoを取り出すことができる。pg_queryで得られる結果はpg_fetch_xxxに与えて初めて普通のデータとなる。
そのままでは"resouce id #3"などといったリソースを示すものとなっている。
<?php $dbconn= pg_connect('host=localhost port=5432 dbname=postgres user=postgres password=postgres'); if(!$dbconn){ exit('DB connect failed'); } ?> <html> <head> <title>DB Connect Test</title> </head> <body> <strong>DB Connect Succeeded.</strong> <?php $result= pg_query($dbconn,"SELECT info FROM testTable WHERE name='abc';"); echo "result=".pg_fetch_result($result,0,0) ; ?> </body> </html>
いやあ大変だった
postgreSQLは勧めない。
MySQLに皆乗り換える訳だ。
| 固定リンク