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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:04