LMLPHP后院

解决PHP PDO limit占位符无效技术

maybe yes 发表于 2016-03-21 14:57

PHP PDO 方式操作 MySQL 数据库,当占位符在 limit 后时,导致选出的结果不正确。其实最后结果不是预期,是因为 limit 后面内容PDO 看来认为必须是数字,所以 bindValue 或者 bindParam 必须传入类型参数 PDO::PARAM_INT。

这个坑被前人踩了无数次啦,这个问题有人说算 Bug,最近我还是踩了一次。因为我在 PHP7PHP5 之间经常来回使用,导致开发环境一切换就会出一些小问题

使用 LMLPHP 框架在写法上需要注意一点就能避免这个问题,如下示例:

$this->db->select($table_name, '*', '1=1 order by id desc limit ?, ?', 
[['type'=>PDO::PARAM_INT, 'value'=>0], ['type'=>PDO::PARAM_INT, 'value'=>10]]);
// or
$this->db->query("select * from $table_name order by id desc limit ?, ?", 
[['type'=>PDO::PARAM_INT, 'value'=>0], ['type'=>PDO::PARAM_INT, 'value'=>10]]);

在使用 PDO 操作时,还需要注意占位符要一致性,不可以一边使用问号,一边使用名称。这样会导致 LMLPHP Notice:[2]PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters。如果参数与占位符数量对不上,则会出现报错:Invalid parameter number: number of bound variables does not match number of tokens。下面的写法就是错误的:

$this->db->update($table_name, ['data' => $data], 'where id=?', [$id]);

因为在 LMLPHP 的 PDO update 方法的内部封装使用的是 named 占位符,在 where 参数中应该统一,正确的写法如下:

$this->db->update($table_name, ['data' => $data], 'where id=:id', ['id'=>$id]);
相关文章
2024-04-24 07:22:36 1713914556 0.008633