博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
阅读量:6255 次
发布时间:2019-06-22

本文共 1746 字,大约阅读时间需要 5 分钟。

最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了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组成的字符串作为变量绑定过去,第一次实现的代码如下:

<?php

$data = array(array('id' => 1, 'val' => 2), array('id' => 2, 'val' => 3));    $ids = implode(',', array_map(function($v) {return $v['id'];}, $data)); //获取ID数组    $update_sql = 'UPDATE tbl_test SET val = CASE id';    $params = array();    $params[":ids"] = $ids;    foreach($data as $key => $item) {            $update_sql .= "WHEN :id_" . $key . "THEN :val_" . $key . " ";            $params[":id_" . $key] = $item['id'];            $params[":val_" . $key] = $item['val'];    }    $update_sql .= "END WHERE id IN (:_ids)";    TEST::execute($update_sql, $params);//此处会调用bindParam绑定参数

后来发现这样是行不通的,而且比较诡异的是这样只能更新第一条记录。查阅资料后,发现这样的绑定方式是不行的,IN语句的参数应该一个一个地绑定。看看文档中对bindParam函数的描述:

PDO描述

修改后的写法:

1, 'val' => 2), array('id' => 2, 'val' => 3)); $update_sql = 'UPDATE tbl_test SET val = CASE id'; $params = array(); $params[":ids"] = $ids; $in_arr = array(); foreach($data as $key => $item) { $update_sql .= "WHEN :id_" . $key . "THEN :val_" . $key . " "; $params[":id_" . $key] = $item['id']; $params[":val_" . $key] = $item['val']; $params[":ids_" . $key] = $item['id']; array_push($in_arr, ":id_" . $key); } $update_sql .= "END WHERE id IN (" . implode(',' $in_arr) . ")"; TEST::execute($update_sql, $params);//此处会调用bindParam绑定参数

总结

这是最近遇到的一个小问题,其实更多的是说明在MySQL的IN语句里面做参数绑定时应该一个一个的绑定。

参考链接:

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,请点下推荐,写文章不容易。

转载地址:http://jrnsa.baihongyu.com/

你可能感兴趣的文章
安防大数据应用国家工程实验室在乌鲁木齐成立
查看>>
物理引擎中velocity的单位是个什么鬼?
查看>>
[译] 全新 Android 注入器 : Dagger 2 (二)
查看>>
为什么要评审代码?
查看>>
小程序开发前的准备工作之【深入封装Component】
查看>>
AFN3.0源码解析
查看>>
oracle的drop命令
查看>>
设计与梳理企业二级流程的路线方法
查看>>
Python正则表达式指南
查看>>
使用css3制作渐变分割线
查看>>
垃圾回收概念与算法
查看>>
IconFont 图标svg
查看>>
TFS实现需求工作项自动级联保存
查看>>
springmvc 4.x 处理json 数据时中文乱码
查看>>
nginx 重启命令
查看>>
一花一世界 一叶一菩提
查看>>
Python练习(day7)
查看>>
网络工程师笔试题总结
查看>>
我的友情链接
查看>>
C# DataTable的詳細用法
查看>>