所以下面的代码一直困扰着我:
$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 函数?
最佳答案
这是一个已知问题以及为什么 limit
不应该真正与绑定(bind)参数一起使用。但是,您可以通过单独绑定(bind)参数并将其命名为 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()
,这是因为执行绑定(bind)导致所有参数都被绑定(bind)为字符串。正如 Your Common Sense 指出的那样,您可以禁用仿真模式并让 MySQL 自己整理占位符,尽管这可能不适用于所有数据库驱动程序(尽管适用于 MySQL):
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
或者,您可以对 int 进行
intval
或类型转换,然后将其直接放在您的语句中,如果您愿意这样做的话。关于php - PDO Int 占位符在它们周围获取引号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15984025/