2010-08-01 2 views
0

는 설명해 보자 : 여기 foreach 루프는 치명적인 오류를 제공합니다 : 비 개체의 멤버 함수의 bindParam()를 호출 내가 이와 같은 오류를 처음 얻을 것

내 코드입니다 :

function printSiteIndexedItems($co, $id){ 
    global $allSections; 
    foreach($allSections as $aSection => $aSectionName){ 
    $tr = $co->prepare("SELECT COUNT(id) FROM ". $aSection ." WHERE site=:id AND valide=1"); 
    $tr->bindParam(':id', $id, PDO::PARAM_INT); 
    $tr->execute(); 
    if($indexedItems = $tr->fetchColumn()) echo '<p>'. $aSectionName .' : '. $indexedItems .'</p>'; 
    } 
} 

첫 번째 반복은 정상적으로 작동하며 원하는 항목 (범주 이름과 요소 수)을 인쇄합니다.

그러나 첫 번째 반복 한 후, 나는이 고전적인 오류 얻을 : 그것은 첫 번째 반복 작동으로

Fatal error: Call to a member function bindParam() on a non-object in

는 사실, $ 공동 유효한 PDO 개체입니다. 그러나 우리가 두 번째로 들어가 자마자 더 이상 존재하지 않는 것 같습니다. : o

나는 PDO에 다소 새로운 것이므로 어쩌면 그것은 내가 아직 인정하지 않은 정상적인 행동 일 것이다. 도와주세요 ! =)

+0

코드 블록에 코드를 넣어주세요, 그렇지 않으면 읽을 수 있습니다. –

+0

당신은 $ foo와 같은 코드 조각조차도 의미합니까? – Pioul

+0

왜 같은 종류의 데이터에 대해 여러 개의 테이블이 있습니까? 이것은 데이터베이스 디자인 코드의 냄새입니다. –

답변

2

$co->prepare...과 같이 보이는 것은 준비하려는 stamtents 중 적어도 하나에 대해 FALSE를 반환합니다.
if (!$tr) ....을 테스트하거나 $co->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);으로 설정하여 PDO에서 오류가 발생하면 예외가 발생합니다.

+0

'$ co-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION); 'fetchColumn()'대신'fetchAll()'을 사용하라고 알려주는 오류 메시지 덕분에, WORKS! 그러나 나는 여전히'fetchAll()'을 사용해야했던 이유를 모르겠다. 왜냐하면 내 요청은 한 행만 반환하기 때문이다. – Pioul

0

나는 $ co-> prepare가 구문이 유효하지 않음을 나타내는 실패 (false)를 반환한다고 생각한다. $ aSection이 비어 있지 않은지 확인하십시오.

$ aSection이 사용자 입력에서 오는 경우 SQL 주입 문제가 발생할 수 있으므로 지금처럼 쿼리에 $ aSection을 넣지 않아야합니다.

+0

$ aSection이 비어 있지 않았 음을 이미 확인했습니다. 가능한 모든 $ aSection에 대한 SQL 요청을 테스트했습니다 :/ 그리고 $ aSection은 사용자 입력에서 온 것이 아닙니다. 그러나 좋은 습관이 부족합니다 : p – Pioul

0

대부분 $aSection은 유효하지 않습니다. 데이터를 제공하지 않으므로 추측하기가 어렵습니다. PDO 오류 처리에 대한 자세한 내용하시기 바랍니다 :이 코드 같은 http://de.php.net/manual/en/pdo.error-handling.php

뭔가 도움이 될 것입니다

foreach($allSections as $aSection => $aSectionName){ 
    $tr = $co->prepare("SELECT COUNT(id) FROM ". $aSection ." WHERE site=:id AND valide=1"); 
    if (!$tr) { 
     print_r($co->errorInfo()); 
     continue; 
    } 

    $tr->bindParam(':id', $id, PDO::PARAM_INT); 
    $tr->execute(); 
    if($indexedItems = $tr->fetchColumn()) echo '<p>'. $aSectionName .' : '. $indexedItems .'</p>'; 
} 
+0

Arf, print_r (errorInfo());'가 작동하지 않았지만'print_r ($ co -> errorInfo()); '실제로, 나는 당신의 링크 (나는 그것이 타이핑 에러라고 생각한다)를 들여다 본 후에 그것을 깨달았다. 어쨌든 고마워! – Pioul

+0

위의 코드가 수정되었습니다. 천만에요. – johannes

관련 문제