Foreach循环带来致命错误:在非对象上调用成员函数bindParam()

时间:2010-08-01 22:58:59

标签: php pdo

这是我第一次收到像这样的错误,让我解释一下:

这是我的代码:

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>';
  }
 }

第一次迭代工作正常,它打印出我想要的内容(类别名称和其中的元素数量)。

但是在第一次迭代之后,我得到了这个经典错误:

  

致命错误:在

中的非对象上调用成员函数bindParam()

实际上,$ co是一个有效的PDO对象,因为它适用于第一次迭代。但似乎一旦我们进入第二个,它就不再是了? :○

我对PDO有点新意,所以也许这是一种我还没有承认的正常行为。请帮忙 ! =)

3 个答案:

答案 0 :(得分:2)

对于您尝试准备的至少一个站点,$co->prepare...看起来返回FALSE。
当PDO遇到错误时,测试if ( !$tr ) ....或设置$co->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);以获得异常。

答案 1 :(得分:0)

我认为$ co-&gt; prepare会返回失败(可能是false),这表明该语句无效。确保$ aSection不为空。

你也不应该像现在这样把$ aSection放到查询中,因为如果$ aSection来自用户输入,你可能会遇到SQL注入问题。

答案 2 :(得分: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>';
}