所以下面的代码一直在困扰我:
$stm = $pdo->prepare("SELECT * FROM urls WHERE account=? AND NOT deleted LIMIT ?, 4");
$stm->execute($user, ($request-1)*4);
每当我执行此查询时,它都会返回此错误:
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', 4' at line 1'
看起来似乎在使用?除非您使用bindParam指定,否则占位符会自动在其周围放置引号。有没有办法解决这个问题而不必使用bingparam函数?
答案 0 :(得分:4)
这是一个已知问题,为什么limit
不应该与绑定参数一起使用。但是,您可以通过单独绑定参数并将其命名为int来克服此问题。
$stm = $pdo->prepare("SELECT * FROM urls WHERE account=? AND NOT deleted LIMIT ?, 4");
$stm->bindValue(1, $user);
$stm->bindValue(2, ($request-1)*4), PDO::PARAM_INT);
$stm->execute();
如果您阅读PDOStatement::execute()
,则会导致它,因为对执行的绑定会导致所有参数都绑定为字符串。
正如Your Common Sense指出的那样,你可以禁用仿真模式,让MySQL自己整理占位符,虽然这可能不适用于所有数据库驱动程序(虽然将使用MySQL):
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
或者你可以对一个int进行intval
或者类型转换,如果你愿意这样做,可以直接把它放在你的语句中。