DBD::PgPP on Windows Vista
fetchがどうのこうので昨日失敗していたのは私がPostgreSQLをインストールした際に作ったデータベースの名称が当初のソースと違っていたためでした。ソースのデータベースの名前を変更した。
めでたい事にApache->ActivePerl->DBI->DBD::PgPP->PostgreSQLは出勤中の朝の電車の中で動作した。
いくつかのテーブルを作っていないとかあったけど、瑣末事です。
その後、プログラムを動作させるとエラーが出る。
Apacheのエラーログで
[Wed Jul 25 18:36:21 2007] [error] [client 127.0.0.1] Can't call method "db_connect" on an undefined value at C:/Users/hogehoge/Documents/cgi-bin/action.cgi line 227.\r, referer: http://localhost/cgi-bin/project.cgi
との内容。
調べてみたら、
$db1=DBI->connect("DBI:PgPP:host=$host;dbname=$dbname", $user, $passwd); $st = $db1->prepare($SQL); $res = $st->execute; while(@res = $st->fetchrow){ $st1 = $db1->prepare($SQL2); $res1 = $st1->execute; @res1 = $st1->fetchrow; : $st1->finish; }
のようにDBI->connectで作成されたオブジェクトでfetchをかけた結果に対して再度SQLを発行しfetchする
@res1 = $st1->fetchrow;
のあたりで発生している模様。
で、
$db1=DBI->connect("DBI:PgPP:host=$host;dbname=$dbname", $user, $passwd); $st = $db1->prepare($SQL); $res = $st->execute; while(@res = $st->fetchrow){ $db2=DBI->connect("DBI:PgPP:host=$host;dbname=$dbname", $user, $passwd); $st1 = $db2->prepare($SQL2); $res1 = $st1->execute; @res1 = $st1->fetchrow; : $st1->finish; $db2->disconnect; }
のようにループの中で再度connectして$db2を作ってその$db2を使って検索かければうまく行った。まあ、本当にこれで良いかどうかはわからないけど動いたので結果オーライと言うことで。