国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[PDO綁定參數]使用PHP的PDO擴展進行批量更新操作

yearsj / 1668人閱讀

摘要:方案選擇筆者已知的做批量更新有以下幾種方案逐條更新這種是最簡單的方案,但無疑也是效率最低的方案。類似如下的語句綁定參數為了防止注入,使用了擴展綁定參數。

最近有一個批量更新數據庫表中某幾個字段的需求,在做這個需求的時候,使用了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語句的參數應該一個一個地綁定??纯次臋n中對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?

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

如果本文對你有幫助,請點下推薦,寫文章不容易。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/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元查看
<