摘要:方案選擇筆者已知的做批量更新有以下幾種方案逐條更新這種是最簡(jiǎn)單的方案,但無(wú)疑也是效率最低的方案。類(lèi)似如下的語(yǔ)句綁定參數(shù)為了防止注入,使用了擴(kuò)展綁定參數(shù)。
最近有一個(gè)批量更新數(shù)據(jù)庫(kù)表中某幾個(gè)字段的需求,在做這個(gè)需求的時(shí)候,使用了PDO做參數(shù)綁定,其中遇到了一個(gè)坑。
方案選擇筆者已知的做批量更新有以下幾種方案:
1、逐條更新
這種是最簡(jiǎn)單的方案,但無(wú)疑也是效率最低的方案。
2、CASE WHEN
類(lèi)似如下的語(yǔ)句
UPDATE tbl_test SET val = CASE id WHEN 1 THEN 2 WHEN 2 THEN 3 END WHERE id IN(1, 2);
PDO綁定參數(shù)
為了防止SQL注入,使用了PDO擴(kuò)展綁定參數(shù)。上面的數(shù)字在一般情況下是變量,那么就需要做參數(shù)綁定。剛開(kāi)始是想著在IN的時(shí)候?qū)d組成的字符串作為變量綁定過(guò)去,第一次實(shí)現(xiàn)的代碼如下:
$data = array(array("id" => 1, "val" => 2), array("id" => 2, "val" => 3)); $ids = implode(",", array_map(function($v) {return $v["id"];}, $data)); //獲取ID數(shù)組 $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);//此處會(huì)調(diào)用bindParam綁定參數(shù)
后來(lái)發(fā)現(xiàn)這樣是行不通的,而且比較詭異的是這樣只能更新第一條記錄。查閱資料后,發(fā)現(xiàn)這樣的綁定方式是不行的,IN語(yǔ)句的參數(shù)應(yīng)該一個(gè)一個(gè)地綁定??纯次臋n中對(duì)bindParam函數(shù)的描述:
修改后的寫(xiě)法:
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);//此處會(huì)調(diào)用bindParam綁定參數(shù)總結(jié)
這是最近遇到的一個(gè)小問(wèn)題,其實(shí)更多的是說(shuō)明在MySQL的IN語(yǔ)句里面做參數(shù)綁定時(shí)應(yīng)該一個(gè)一個(gè)的綁定。
參考鏈接:
mysql語(yǔ)句:批量更新多條記錄的不同值
Can I bind an array to an IN() condition?
原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬(wàn)望告知。
如果本文對(duì)你有幫助,請(qǐng)點(diǎn)下推薦,寫(xiě)文章不容易。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30326.html
摘要:二對(duì)象利用的構(gòu)造函數(shù)連接特定的數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)對(duì)象。連接數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)有三種方式通過(guò)參數(shù)形式連接推薦構(gòu)造函數(shù)還有一個(gè)參數(shù),它是一個(gè)數(shù)組,用于配置運(yùn)行中的數(shù)據(jù)庫(kù),如是否開(kāi)啟自動(dòng)提交設(shè)置結(jié)果集的返回方式等。 一、PDO簡(jiǎn)介 PDO是PHP Data Object的簡(jiǎn)稱,用于定義數(shù)據(jù)庫(kù)訪問(wèn)的抽象層,統(tǒng)一各種數(shù)據(jù)庫(kù)的訪問(wèn)接口。PDO有如下特性: 編碼一致性:PDO支持多種數(shù)據(jù)庫(kù)擴(kuò)展,并為...
摘要:是什么首先思考為什么選擇是一個(gè)數(shù)據(jù)訪問(wèn)抽象層抽象是雙重的一個(gè)是眾所周知但不太重要的另一個(gè)是模糊的但是是最重要的眾所周知為不同的數(shù)據(jù)庫(kù)提供了統(tǒng)一的接口雖然這個(gè)功能本身很龐大但是對(duì)于固定程序來(lái)說(shuō)不是過(guò)于重要的事情基本所有的程序都是使用統(tǒng)一的后端 PDO是什么 首先思考, 為什么選擇PDO PDO 是一個(gè)數(shù)據(jù)訪問(wèn)抽象層(Database Access Abstraction Layer). ...
具體參考《PHP核心技術(shù)與最佳實(shí)踐》的5.1章 《什么是PDO》 1. PDO的介紹 PHP針對(duì)每種數(shù)據(jù)庫(kù)都有一個(gè)獨(dú)立的模塊、一組獨(dú)立的函數(shù)。這樣的結(jié)構(gòu)和設(shè)計(jì)讓PHP兼容多種數(shù)據(jù)庫(kù)變得困難。一旦要將一個(gè)應(yīng)用移到另外一種數(shù)據(jù)庫(kù)環(huán)境中,或者是需要添加新的數(shù)據(jù)庫(kù)支持,就不得不重新編寫(xiě)和數(shù)據(jù)庫(kù)相關(guān)的操作。通常編寫(xiě)多個(gè)類(lèi),用適配器模式來(lái)實(shí)現(xiàn)。在這個(gè)歷史背景下PDO出現(xiàn)了。PDO(PHP Data Objec...
閱讀 2155·2023-04-26 00:23
閱讀 830·2021-09-08 09:45
閱讀 2451·2019-08-28 18:20
閱讀 2559·2019-08-26 13:51
閱讀 1612·2019-08-26 10:32
閱讀 1406·2019-08-26 10:24
閱讀 2043·2019-08-26 10:23
閱讀 2210·2019-08-23 18:10