在非对象PDO上调用成员函数setFetchMode()

时间:2012-11-08 14:41:36

标签: php sql pdo

  

可能重复:
  PDO Database access WHERE title = $title

以下是$ message内容的示例:

  

String(108)“\ n cc je t'aienvoy inune a plus:p \ n”

以下是错误消息:

  

致命错误:在非对象上调用成员函数setFetchMode()   在第101行的B:\ wamp \ www \ messages.php

我的请求不起作用:

    $resultats = $connexion->query("SELECT * FROM messages WHERE message LIKE '%$message%'");
    $resultats->setFetchMode(PDO::FETCH_OBJ);
    $occurences= $resultats->rowCount();

为什么这个有效? (我用a改变了$ message):

 $resultats = $connexion->query("SELECT * FROM messages WHERE message LIKE '%a%'");
        $resultats->setFetchMode(PDO::FETCH_OBJ);
        $occurences= $resultats->rowCount();

2 个答案:

答案 0 :(得分:1)

尝试使用PDO准备。这几乎等同于mysql_real_escape_string()。这可能会消除由于特殊字符引起的大多数(如果不是全部)错误。

答案 1 :(得分:1)

简单地使用与mysql_*相同的技术使用PDO对您没有任何好处,您需要利用其parameterized queries

$query = $connexion->prepare("SELECT * FROM messages WHERE message LIKE ?");
$query->setFetchMode(PDO::FETCH_OBJ);
if($query->execute(array('%'.$message.'%'))) {
    // process
}
else {
    // only for debugging purposes, not a live app
    var_dump($connexion->errorInfo());
}

它执行所有必要的自动和正确的转发,您通过execute()方法传递参数。


至于I used addslashes不安全。使用如上所示的准备好的陈述。

除非您正在生成SQL - 实际的SQL逻辑,而不是用用户生成的内容填充空白 - 否则永远不会在SQL中需要PHP变量。