成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

laravel批量更新多條記錄,可防止SQL注入

Drummor / 2685人閱讀

摘要:寫在前面熟悉的童鞋都知道,有批量一次性插入多條記錄,卻沒有一次性按條件更新多條記錄。本篇文章,結(jié)合的做了調(diào)整,可有效防止注入。

寫在前面

熟悉laravel的童鞋都知道,laravel有批量一次性插入多條記錄,卻沒有一次性按條件更新多條記錄。

是否羨慕thinkphp的saveAll,是否羨慕ci的update_batch,但如此優(yōu)雅的laravel怎么就沒有類似的批量更新的方法呢?

高手在民間

Google了一下,發(fā)現(xiàn)stackoverflow( https://stackoverflow.com/que... )上已經(jīng)有人寫好了,但是并不能防止sql注入。

本篇文章,結(jié)合laravel的Eloquent做了調(diào)整,可有效防止sql注入。

getTable(); // 表名
            $firstRow  = current($multipleData);

            $updateColumn = array_keys($firstRow);
            // 默認(rèn)以id為條件更新,如果沒有ID則以第一個(gè)字段為條件
            $referenceColumn = isset($firstRow["id"]) ? "id" : current($updateColumn);
            unset($updateColumn[0]);
            // 拼接sql語句
            $updateSql = "UPDATE " . $tableName . " SET ";
            $sets      = [];
            $bindings  = [];
            foreach ($updateColumn as $uColumn) {
                $setSql = "`" . $uColumn . "` = CASE ";
                foreach ($multipleData as $data) {
                    $setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
                    $bindings[] = $data[$referenceColumn];
                    $bindings[] = $data[$uColumn];
                }
                $setSql .= "ELSE `" . $uColumn . "` END ";
                $sets[] = $setSql;
            }
            $updateSql .= implode(", ", $sets);
            $whereIn   = collect($multipleData)->pluck($referenceColumn)->values()->all();
            $bindings  = array_merge($bindings, $whereIn);
            $whereIn   = rtrim(str_repeat("?,", count($whereIn)), ",");
            $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
            // 傳入預(yù)處理sql語句和對應(yīng)綁定數(shù)據(jù)
            return DB::update($updateSql, $bindings);
        } catch (Exception $e) {
            return false;
        }
    }
}

可以根據(jù)自己的需求再做調(diào)整,下面是用法實(shí)例:

// 要批量更新的數(shù)組
$students = [
    ["id" => 1, "name" => "張三", "email" => "[email protected]"],
    ["id" => 2, "name" => "李四", "email" => "[email protected]"],
];

// 批量更新
app(Students::class)->updateBatch($students);

生成的SQL語句如下:

UPDATE pre_students
SET NAME = CASE
WHEN id = 1 THEN
    "張三"
WHEN id = 2 THEN
    "李四"
ELSE
    NAME
END,
 email = CASE
WHEN id = 1 THEN
    "[email protected]"
WHEN id = 2 THEN
    "[email protected]"
ELSE
    email
END
WHERE
    id IN (1, 2)
    

是不是效率又提高了一大截呢~

原文 http://www.tech1024.cn/origin...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30626.html

相關(guān)文章

  • jdbc就是這么簡單

    摘要:使用執(zhí)行單元測試查詢獲取連接對象根據(jù)連接對象,得到執(zhí)行語句,返回遍歷結(jié)果集查詢獲取連接對象根據(jù)連接對象,得到執(zhí)行添加影響的行數(shù),,如果大于表明操作成功。否則失敗更新成功更新失敗光標(biāo)選中方法名字,然后右鍵執(zhí)行單元測試。 文章有不當(dāng)之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號:好好學(xué)java,獲取優(yōu)質(zhì)學(xué)習(xí)資源。 一、JDBC JAVA Database Connectivi...

    li21 評論0 收藏0
  • Java JDBC編程

    摘要:和很像,嚴(yán)格來說,應(yīng)該是模仿了是設(shè)計(jì)。程序中使用該類的主要功能是獲取對象,該類包含如下方法該方法獲得對應(yīng)數(shù)據(jù)庫的連接代表數(shù)據(jù)庫連接對象,每個(gè)代表一個(gè)物理連接會(huì)話。當(dāng)執(zhí)行查詢時(shí),返回查詢到的結(jié)果集。程序可以通過操作該對象來取出查詢結(jié)果。 JDBC基礎(chǔ) JDBC的全稱是Java Database Connectivity,即Java數(shù)據(jù)庫連接,它是一種可以執(zhí)行SQL語句的Java API。...

    鄒強(qiáng) 評論0 收藏0
  • Laravel5 基礎(chǔ)查詢構(gòu)造器

    摘要:原生語句使用原生語句查詢請先引入查詢語句語句執(zhí)行成功返回插入語句語句執(zhí)行成功返回修改語句語句返回受影響行數(shù)刪除語句語句返回刪除行數(shù)注建議語句中的變量請盡量使用占位,然后在執(zhí)行時(shí)使用數(shù)組的方式替換,有助于防止注入攻擊。 原生SQL語句 使用原生sql語句查詢請先引入 use IlluminateSupportFacadesDB; 查詢語句 // sql 語句 $sql = SELECT ...

    Doyle 評論0 收藏0
  • gf框架之gdb - 優(yōu)雅強(qiáng)大的數(shù)據(jù)庫ORM

    摘要:文章來源框架的數(shù)據(jù)庫操作由包提供支持,包經(jīng)過非常精心優(yōu)雅的設(shè)計(jì),提供了非常強(qiáng)大的配置管理方法操作鏈?zhǔn)讲僮魇聞?wù)操作等功能。其他鏈?zhǔn)讲僮髡垍⒖忌鲜鲦準(zhǔn)讲僮髡鹿?jié)。 文章來源:http://gf.johng.cn/494380 gf框架的數(shù)據(jù)庫ORM操作由gdb包提供支持,gdb包經(jīng)過非常精心優(yōu)雅的設(shè)計(jì),提供了非常強(qiáng)大的配置管理、方法操作、鏈?zhǔn)讲僮?、事?wù)操作等功能。gdb包具體API說明文檔詳...

    muzhuyu 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<