[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
来源:互联网 发布:python的数据结构 编辑:程序博客网 时间:2024/05/23 13:21
最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了PDO做参数绑定,其中遇到了一个坑。
方案选择
笔者已知的做批量更新有以下几种方案:
1、逐条更新
这种是最简单的方案,但无疑也是效率最低的方案。
2、CASE WHEN
类似如下的语句
UPDATE tbl_test SET val = CASE id WHEN 1 THEN 2 WHEN 2 THEN 3 END WHERE id IN(1, 2);
PDO绑定参数
为了防止SQL注入,使用了PDO扩展绑定参数。上面的数字在一般情况下是变量,那么就需要做参数绑定。刚开始是想着在IN的时候将id组成的字符串作为变量绑定过去,第一次实现的代码如下:
1 <?php 2 $data = array(array('id' => 1, 'val' => 2), array('id' => 2, 'val' => 3)); 3 $ids = implode(',', array_map(function($v) {return $v['id'];}, $data)); //获取ID数组 4 $update_sql = 'UPDATE tbl_test SET val = CASE id'; 5 $params = array(); 6 $params[":ids"] = $ids; 7 foreach($data as $key => $item) { 8 $update_sql .= "WHEN :id_" . $key . "THEN :val_" . $key . " "; 9 $params[":id_" . $key] = $item['id'];10 $params[":val_" . $key] = $item['val'];11 }12 $update_sql .= "END WHERE id IN (:_ids)";13 TEST::execute($update_sql, $params);//此处会调用bindParam绑定参数
后来发现这样是行不通的,而且比较诡异的是这样只能更新第一条记录。查阅资料后,发现这样的绑定方式是不行的,IN语句的参数应该一个一个地绑定。看看文档中对bindParam函数的描述:
可以看到,说明里写的是会绑定一个PHP变量到占位符里,所以如果绑定了:ids为1, 2的字符串,那么MySQL解析语句的时候会将1,2解析为单个的变量,而不会当作一串。这也是PDO防SQL注入的原理,通过占位符的绑定,只将绑定的值当作一个值,而不是语句之类的其它东西,这样MySQL只会把传递过去的值当作一个变量的值。
修改后的写法:
1 <?php 2 $data = array(array('id' => 1, 'val' => 2), array('id' => 2, 'val' => 3)); 3 $update_sql = 'UPDATE tbl_test SET val = CASE id'; 4 $params = array(); 5 $params[":ids"] = $ids; 6 $in_arr = array(); 7 8 foreach($data as $key => $item) { 9 $update_sql .= "WHEN :id_" . $key . "THEN :val_" . $key . " ";10 $params[":id_" . $key] = $item['id'];11 $params[":val_" . $key] = $item['val'];12 $params[":ids_" . $key] = $item['id'];13 array_push($in_arr, ":id_" . $key);14 }15 $update_sql .= "END WHERE id IN (" . implode(',' $in_arr) . ")";16 TEST::execute($update_sql, $params);//此处会调用bindParam绑定参数
总结
这是最近遇到的一个小问题,其实更多的是说明在MySQL的IN语句里面做参数绑定时应该一个一个的绑定。
0 0
- [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
- 使用PHP的PDO类操作MySQL
- [PHP]PDO的使用
- PHP PDO的使用
- PHP PDO的使用
- php-PDO-预处理绑定参数的一个细节
- PHP PDO操作使用MySql
- php使用pdo操作数据
- Php中使用PDO操作MySQL数据库(查询 更新 删除)
- Php中使用PDO操作MySQL数据库(查询 更新 删除)
- PHP PDO扩展 ----- PDOstatement
- php 安装pdo 扩展
- PHP安装pdo扩展
- php扩展之PDO
- PHP中PDO的使用
- PHP中PDO的使用
- php中pdo的使用
- pdo的使用操作1
- 【CSS3进阶】酷炫的3D旋转透视
- MySQL索引背后的数据结构及算法原理
- java synchronized详解
- Java中Json对象序列化与反序列化工具类
- Java的接口和抽象类
- [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
- 获取当前运行程序路径
- 易生活(一)-APP---回调函数在异步操作中的应用
- React Native 中组件的生命周期
- 页面获取MySQL时间转换(个人菜鸟笔记)
- 快速消费品行业前景及进入门槛
- Android drawable微技巧,你所不知道的drawable的那些细节
- 《学习OpenCV》课后习题解答1
- 58同城二手市场个人信息的采集分析
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
股票交流qq群
股票群名字
股票群号大全
股票推荐群
股票交易群
股票qq群号
股票群qq号
股票群qq群
加股票群
好的股票qq群
qq股票交流群
免费炒股群
股票交流群号
寻找股票群
涨停股票群
炒股票群
股票群大全
推荐股票群
哪个股票群好
股票学习群
股票群qq交流号大全
股票期货群
免费股票群
股票的群
股票入门群
私募股票群
股票q群
股票群名称大全霸气
qq群 股票
股票交流群有哪些
股票群介绍
做股票的群
做股票的qq群
全国股票群
炒股票的群
股票qq群推荐
股票群吧
股票散户qq群
玩股票的群
股票免费群
股票期货qq群