摘要:方案選擇筆者已知的做批量更新有以下幾種方案逐條更新這種是最簡單的方案,但無疑也是效率最低的方案。類似如下的語句綁定參數為了防止注入,使用了擴展綁定參數。
最近有一個批量更新數據庫表中某幾個字段的需求,在做這個需求的時候,使用了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 是一個數據訪問抽象層(Database Access Abstraction Layer). ...
閱讀 2145·2023-04-26 00:23
閱讀 820·2021-09-08 09:45
閱讀 2442·2019-08-28 18:20
閱讀 2548·2019-08-26 13:51
閱讀 1602·2019-08-26 10:32
閱讀 1398·2019-08-26 10:24
閱讀 2035·2019-08-26 10:23
閱讀 2201·2019-08-23 18:10