1

私の現在の perl コードは、データベース クエリのすべての行を実行してから、

DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at ./recieveTxn.cgi 
line 168.

最後に。行の終わりでループを停止するように指示していない何かがあるようですが、他のものと同じように記述しました。

たとえば、クエリはプルアップします

shortcode1
shortcode2
shortcode3
次に、ここでエラーをスローします

$sql = "
    SELECT
        aPI.folder AS aPIfolder, 
        aPI.rowNum AS aPIrowNum,
        hasInput,
        evalCode
    FROM
        aPersonalItems as aPI
    LEFT JOIN 
        pItems_special_inputs as SI 
    ON
        aPI.folder = SI.folder AND
        aPI.rowNum = SI.rowNum
    WHERE
        hasInput=1 AND
        aPI.folder='$FORM{'folder'}'
    ORDER BY
        aPI.rowNum
";

$sth = $dbh->prepare( $sql );
$sth->execute();

my ($shortcoderow, $row);
my $shortcodeSQL = "
    SELECT 
        * 
    FROM
        pItemsShortCodes 
    WHERE
        folder='$FORM{'folder'}' 
    ORDER BY
        rowNum
";
my $shortcodeSTH = $dbh->prepare( $shortcodeSQL );
$shortcodeSTH->execute();

while( my $ref = $sth->fetchrow_hashref() ) {

    my $shortCode;
    my $isblank = 1;
    my $rowNum  = $ref->{'aPIrowNum'};

    while(my $shortcodeRef = $shortcodeSTH->fetchrow_hashref())
    #&& $rowNum == $shortcodeRef->{'rowNum'}) #line 168 above
    {
        $shortCode=$shortcodeRef->{'shortcode'};
        print $shortCode."\n";
    }
    $shortcodeSTH->finish();
}
4

1 に答える 1

6

問題は、 から複数の行を処理していることです$sth

コードは から行をフェッチし、行がなくなるまで$sthからすべての行をループします。$shortcodeSTH次に、コードはfinish()メソッドを on で呼び出します$shortcodeSTH。(すでにすべての行をフェッチしているため、これは規範的なパターンです。)

次に、コードは外側のループをもう一度開始し、 から 2 番目の行をフェッチし$sthます。コード$shortcodeSTHが 2 回目のループを開始しようとすると、既にすべての行がフェッチされ、ステートメント ハンドルが閉じられています。取得する行はもうありません。(メソッドの呼び出しを発行していない場合、返されるエラーは異なりますfinish()。エラー メッセージは、カーソルの末尾を超えてフェッチしたこと、または最後の行を既にフェッチしたこと、またはその効果に関するものです。)

于 2012-08-24T20:15:34.460 に答える