0

您好,我试图使用 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;
}

我想从 FROM 数行,这是我正在尝试的输出

$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

请帮助谢谢

4

1 回答 1

1

您需要检查PDO::query(). 在(丑陋的)PHP 中有很多返回混合类型值的函数。在PDO::query()返回类型为要么PDOStatement或布尔的情况下,尽管文档中的原型说的有所不同:

描述:
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()
于 2012-05-22T23:44:01.363 回答