[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定_PHP教程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定_PHP教程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2984字,纯文字阅读大概需要5分钟。
内容图文
![[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定_PHP教程](/upload/InfoBanner/zyjiaocheng/191/7e3776c4330249a0837d6fe0c137213f.jpg)
[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定
最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了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语句里面做参数绑定时应该一个一个的绑定。
参考链接:
mysql语句:批量更新多条记录的不同值
Can I bind an array to an IN() condition?
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
如果本文对你有帮助,请点下推荐,写文章不容易。
http://www.bkjia.com/PHPjc/1122769.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1122769.htmlTechArticle[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定 最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用...
内容总结
以上是互联网集市为您收集整理的[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定_PHP教程全部内容,希望文章能够帮你解决[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,pdo绑定_PHP教程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。