作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以下面的代码一直困扰着我:
$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 自己整理占位符,尽管这可能不适用于所有 DB 驱动程序(尽管适用于 MySQL):
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
或者您可以执行 intval
或类型转换为 int,然后将其直接放入语句中(如果您愿意的话)。
关于php - PDO Int 占位符在它们周围获取引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15984025/
我是一名优秀的程序员,十分优秀!