如何在PDO prepare预编译SQL语句中使用offset和limit参数
报错根因
PDO 默认绑定参数时会将所有值作为字符串处理,自动为参数添加单引号。而 MariaDB/MySQL 的 LIMIT 和 OFFSET 语法要求传入整数类型参数,你当前代码生成的非法SQL为 limit '0','6',不符合语法规则所以触发报错。
修复方案
步骤1:绑定参数时指定整数类型
调用bindParam时传入第三个参数PDO::PARAM_INT,强制PDO将参数识别为整数处理,不会额外添加单引号。
步骤2(推荐配置):关闭PDO模拟预处理
部分环境默认开启PDO本地模拟预处理功能,会绕过数据库原生的参数类型校验,也可能导致参数类型识别错误,建议在初始化PDO连接时添加配置关闭该功能。
修复后完整代码
// ====== PDO初始化时添加该配置,仅需配置一次 ====== $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // ====== 原有业务逻辑修复后代码 ====== $limit = 6; if(isset($_GET['page'])){ $page = (int)$_GET['page']; // 额外强制转整型,避免非法页码参数 }else{ $page = 1; } $offset = ($page - 1) * $limit; $sql4 = $con->prepare("select * from products order by id desc limit ?,?"); $sql4->bindParam(1, $offset, PDO::PARAM_INT); $sql4->bindParam(2, $limit, PDO::PARAM_INT); $sql4->execute();
注意:如果使用
$sql4->execute([$offset, $limit])的写法,即使参数是整数,默认也会被当作字符串处理,因此涉及LIMIT等要求整型的参数场景,更推荐使用带类型指定的bindParam写法。
内容的提问来源于stack exchange,提问作者Safina Siddique
相关产品推荐
相关产品推荐

