2012-08-24 3 views
1
의 말에 내 현재의 펄 코드는 데이터베이스 쿼리의 모든 행을 실행 한 후 마지막에

펄은없는 가져 오기 오류를 실행 - 실행

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

을 던지고있다

. 행의 끝에 멈추는 루프를 말하지 않는 것이 거의 비슷하지만, 나는 다른 것과 마찬가지로 그것을 작성했습니다.

그래서 예를 들면 : 쿼리는
shortcode2
shortcode3

shortcode1 끌어 것이 다음 문제는 당신이에서 하나 개 이상의 행을 처리하는 것입니다

$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(); 
} 
+2

'while' 루프 안에서'finish()'무엇을하고 있습니까? – Mat

답변

6

여기에 오류가 발생 $sth.

코드가 $sth에서 행을 가져오고 더 이상 행이 없을 때까지 $shortcodeSTH에서 모든 행을 코드가 반복합니다. 그런 다음 코드는 $shortcodeSTHfinish() 메서드를 호출합니다. (모든 행을 이미 가져 왔으므로 규범적인 패턴입니다.)

그런 다음 코드는 두 번째 행을 다시 시작하여 두 번째 행을 $sth에서 가져옵니다. 코드가 두 번째로 $shortcodeSTH 루프를 통해 시작하려고하면 이미 모든 행을 가져 와서 명령문 핸들을 닫았습니다. 검색 할 행이 더 이상 없습니다. (finish() 메서드에 대한 호출을 실행하지 않은 경우 반환되는 오류는 다를 수 있으며, 오류 메시지는 커서의 끝을 지나치게 가져 오거나 마지막 행을 가져온 것 또는 그 효과가있는 것입니다.)

관련 문제