如何在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
相关产品推荐
相关产品推荐

