记(Laravel)PDO 使用prepared statement 预处理LIMIT等字段遇到的坑。
来源:互联网 发布:pycharm和python 编辑:程序博客网 时间:2024/06/05 16:11
以下说明基于PHP7.1版本,Laravel 5.2版本。
直接贴代码:
$sql = " SELECT id from my_table LIMIT ?,? "; $tests = DB::select($sql, [$offset, $limit]);
Laravel 5.2版本,默认 ATTR_EMULATE_PREPARES设置为true.
在文件 Illuminate/Database/Connectors/Connector.php 24行.
class Connector{ use DetectsLostConnections; /** * The default PDO connection options. * * @var array */ protected $options = [ PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMULATE_PREPARES => true, ];
由于一些驱动不支持原生的预处理语句,PDO可以完全模拟预处理。
同时,PDO的模拟预处理是默认打开的,并且,laravel对PDO的配置也是默认打开的.
即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能。
坑在这里:
PDO会把SQL语句进行模拟预处理之后会发送给MYSQL一个原始的SQL语句。
这种方式很诡异的是如果预处理的SQL语句中需要处理的字段不是表中的字段时,PDO会对绑定的参数
无脑添加单引号
无脑添加单引号
无脑添加单引号
因而导致了异常或查询不到结果。
即:
limit '0','1'
解决这种问题的方法是设置PDO不去模拟预处理,而是交给MYSQL本身去做。方法是设置PDO的参数 ATTR_EMULATE_PREPARES 为 false
Laravel 中是在 config/database.php
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, 'options' =>[ PDO::ATTR_EMULATE_PREPARES => false, ],
阅读全文
0 0
- 记(Laravel)PDO 使用prepared statement 预处理LIMIT等字段遇到的坑。
- PHP PDO exec, query, prepared statement
- mysql的prepared statement
- Prepared statement
- 在 Laravel 中使用 Laravel Searchy 遇到的坑
- pdo的预处理
- PHP PDO中不能使用limit,阿里云中limit的奇怪之处
- PHP+MYSQL中使用PDO的预处理语句
- php 基于PDO的预处理
- php中 pdo的预处理
- laravel 自定义分页 offset 和 limit 的使用
- laravel offset 自定义分页 和 limit 的使用
- Statement、Prepared Statement 和Callable Statement
- laravel 使用两个字段的和排序
- laravel sqlServer遇到的坑
- 关于PDO预处理语句bindParam的坑应对策略
- PDO预处理
- PDO预处理
- java备份数据库四种方法(mysql,mssql数据库备份)
- LeetCode 二分查找第K大的数215. Kth Largest Element in an Array
- linux下编译C++程序
- SIP穿越NAT的rport机制
- ECMAScript 6 常用特性整理
- 记(Laravel)PDO 使用prepared statement 预处理LIMIT等字段遇到的坑。
- 开发者都应该使用的10个C++11特性
- 【字符串】查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- Angular4+NodeJs+MySQL 入门-02 MySql操作类
- js将 一串数字1403149534转换为日期格式
- (转载)request.getParameter() 和request.getAttribute() 区别
- 快速排序 分治法
- 监听器listener.ora中HOST参数配置
- <9>soc sensor与bayer sensor 区别,内外置isp