这是我第一次收到像这样的错误,让我解释一下:
这是我的代码:
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有点新意,所以也许这是一种我还没有承认的正常行为。请帮忙 ! =)
答案 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>';
}