水曜以外もどうでしょう

北海道発。食べ歩きの記録グルメ情報や北海道の見どころなどをメモ替わりに書いています。

PREV | PAGE-SELECT | NEXT

≫ EDIT

postgresql row number 0 is out of range 0..-1

perl cgi + postgresqlのwebサイトにて。

極端にアクセスの多いサイトではないのにerror_logが結構大きくなっている。
不審に思って見てみると、

row number 0 is out of range 0..-1

このエラー。

ぱっと見、配列の要素ないところをアクセスしたのだろう。
しかも0だから、空の配列の先頭をアクセスしたらしい。

原因は想像つくのだが、
プログラムのファイル名や行番号などは出ないので、ソースのどこか探りにくい。
一応、access_logも眺めてみて、どこのページにアクセスした時かは分かるが、
複数のプログラムをインクルードしているので、追うのは結構至難の技。

だが、経験上、
postgresqlのdbの内容を参照するときに、selectで取り出した内容が『空である』場合にも要素を参照してしまうのが原因。

それを頼りにソースをさがす。

こんな箇所。
----------
use Pg;
$db_connect= Pg::connectdb("省略");

$sql = "select a from target where id=$id";
$result = $db_connect->exec( $sql );
$a = $result->getvalue(0, 0);
----------

$idにはまともなものがくるというのは勝手な思い込みで、dbにないものもあるかもしれない。

安直だけど、こんなふうにしてみた。
----------
$sql = "select a from target where id=$id";
$result = $db_connect->exec( $sql );
$num = $result->ntuples;
if( $num > 0 ){
$a = $result->getvalue(0, 0);
}
----------

こんな箇所をいくつか修正して、現在運用しながらチェック中。


ちなみに、rowではなく、columnのエラーもあり。

column number 4 is out of range 0..3
( column number n is out of range 0..-n )

これは単純に、selectに指定したフィールド数と、getvalueで取り出す個数があっていなかった。
凡ミスだ。

----------
$sql = "select a from target where id=$id";
$result = $db_connect->exec( $sql );
$num = $result->ntuples;
if( $num > 0 ){
$a = $result->getvalue(0, 0);
$b = $result->getvalue(0, 1); # ★←このカラムはない。
}
----------

スポンサーサイト
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| データベース | 10:59 | comments:0| trackbacks:0| TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://vmemo.blog36.fc2.com/tb.php/225-0e679a11

TRACKBACK

PREV | PAGE-SELECT | NEXT