您好,我试图使用 PDO 制作功能,但出现错误(PDO 新手)这是我的代码
function mail_id($mail){
global $host, $dbname, $user, $pass;
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$STH = $DBH->query("select count(from) from messages where from = '$mail'");
$STH->setFetchMode(PDO::FETCH_ASSOC);
$row = $STH->fetch();
return $row;
}
我想从中计算行,这是我正在尝试的输出
$mail=mail_id($userid);
if (0<count($mail['to_viewed'])) {echo "green";} else {echo "gray";}
这是错误
Call to a member function setFetchMode() on a non-object
请帮忙谢谢
您需要检查 PDO::query()
的返回值。在(丑陋的)PHP中,有很多函数返回混合类型的值。在PDO::query()
的情况下,返回类型为 PDOStatement
或 bool,尽管文档中的原型说了一些不同的东西:
描述:
PDOStatement PDO::query ( string $statement )
...
看起来它总是返回PDOStatement
.
返回值:
PDO::query() 返回一个 PDOStatement 对象,或在失败时返回 FALSE.
哎呀,不是在所有情况下!因此,不能保证返回的值是PDOStatement
。
正确的原型是:
描述:
mixed PDO::query ( string $statement )
...
在您的情况下,查询无效(通过使用保留关键字(如 FROM)作为列名),这会导致返回值为 FALSE 的布尔类型返回值。布尔值不是对象,因此对$STH->setFetchMode()
的调用失败。
根据您的 PDO::ATTR_ERRMODE 你会得到
- 异常 (PDO::ERRMODE_EXCEPTION),因此您无需检查返回值
- 警告 (PDO::ERRMODE_WARNING)
- 什么都没有(PDO::ERRMODE_SILENT),所以你必须检查返回值,
errorCode()
和errorInfo()