资讯专栏INFORMATION COLUMN

[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作

yearsj / 1663人阅读

摘要:方案选择笔者已知的做批量更新有以下几种方案逐条更新这种是最简单的方案,但无疑也是效率最低的方案。类似如下的语句绑定参数为了防止注入,使用了扩展绑定参数。

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

    $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函数的描述:

修改后的写法:

 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语句里面做参数绑定时应该一个一个的绑定。

参考链接:
mysql语句:批量更新多条记录的不同值
Can I bind an array to an IN() condition?

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30326.html

相关文章

  • PDO学习笔记

    摘要:二对象利用的构造函数连接特定的数据库,创建一个对象。连接数据库连接数据库有三种方式通过参数形式连接推荐构造函数还有一个参数,它是一个数组,用于配置运行中的数据库,如是否开启自动提交设置结果集的返回方式等。 一、PDO简介 PDO是PHP Data Object的简称,用于定义数据库访问的抽象层,统一各种数据库的访问接口。PDO有如下特性: 编码一致性:PDO支持多种数据库扩展,并为...

    AWang 评论0 收藏0
  • (唯一合适) PDO 教程

    摘要:是什么首先思考为什么选择是一个数据访问抽象层抽象是双重的一个是众所周知但不太重要的另一个是模糊的但是是最重要的众所周知为不同的数据库提供了统一的接口虽然这个功能本身很庞大但是对于固定程序来说不是过于重要的事情基本所有的程序都是使用统一的后端 PDO是什么 首先思考, 为什么选择PDO PDO 是一个数据访问抽象层(Database Access Abstraction Layer). ...

    sf190404 评论0 收藏0
  • PDO使用

    具体参考《PHP核心技术与最佳实践》的5.1章 《什么是PDO》 1. PDO的介绍 PHP针对每种数据库都有一个独立的模块、一组独立的函数。这样的结构和设计让PHP兼容多种数据库变得困难。一旦要将一个应用移到另外一种数据库环境中,或者是需要添加新的数据库支持,就不得不重新编写和数据库相关的操作。通常编写多个类,用适配器模式来实现。在这个历史背景下PDO出现了。PDO(PHP Data Objec...

    Magicer 评论0 收藏0

发表评论

0条评论

yearsj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<