You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PDO操作MySQL的SQL查询中正确使用PHP变量?

PDO中LIMIT子句绑定PHP变量的解决方法

问题原因

PDO调用execute()方法时,默认会把所有传入的参数当作字符串类型处理,会自动给参数加上引号。而MySQL的LIMIT子句要求参数必须是整数类型,加引号后会触发SQL语法错误,所以你尝试的两种占位符写法都无法正常运行。
另外提醒你最开始直接把PHP变量拼入SQL语句的写法存在SQL注入漏洞,禁止在生产环境使用。

解决方法

方法1:关闭PDO模拟预处理(全局生效)

初始化PDO实例时添加如下配置,让MySQL原生的预处理机制来处理参数类型,不需要修改其他业务代码,你之前写的两种占位符写法都可以直接正常运行:

$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'username', 'password');
// 关闭模拟预处理
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

方法2:手动绑定参数指定整数类型

如果不想修改全局配置,可以使用bindValue()或bindParam()方法手动指定参数为整数类型:

问号占位符写法

$startFrom = 0;
$perPage = 12;
$query = $db->prepare("SELECT * FROM products LIMIT ?,?");
$query->bindValue(1, $startFrom, PDO::PARAM_INT);
$query->bindValue(2, $perPage, PDO::PARAM_INT);
$query->execute();
$products = $query->fetchAll();
var_dump($products);

命名占位符写法

$startFrom = 0;
$perPage = 12;
$query = $db->prepare("SELECT * FROM products LIMIT :startFrom, :perPage");
$query->bindValue(':startFrom', $startFrom, PDO::PARAM_INT);
$query->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$query->execute();
$products = $query->fetchAll();
var_dump($products);

内容的提问来源于stack exchange,提问作者MrRE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:36:04