0

可能重复:
PDO 数据库访问 WHERE title = $title

这是 $message 的内容示例:

String(108) "\n cc je t'ai envoy.une 邀请 A 加 :p\n "

这是错误消息:

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

我的请求不起作用:

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

为什么这个有效?(我将 $message 更改为 a):

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

2 回答 2

1

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

于 2012-11-08T14:47:17.817 回答
1

简单地使用 PDO 和使用的相同技术对mysql_*你没有任何好处,你需要利用它的参数化查询

$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 变量。

于 2012-11-08T14:52:11.763 回答