PHP操作MySQL批量Update的寫法,各框架通用防注入版
阿新 • • 發佈:2022-05-17
使用別人的擴充套件遇到了問題,發現沒有做SQL注入的處理。我又寫了個輪子,根據自己需求擴充套件了下,有需要的小夥伴可以直接取用。
這裡就直接貼上原始碼了,會用PHPD ,基本都會如何把它運用到各個框架裡的。
本次專案使用的是laravel框架,此框架裡沒有封裝好的批量更新的方法,所以很多時候在業務要運用到的時候都是自己去寫一個。下面程式碼:
<?php namespace App\Utils; use Illuminate\Support\Facades\DB; class UpdateBatch { /*** * @param string $table 表名 * @param array $values 更新欄位 * @param string $index key值 * @param bool $raw 是否特殊處理 * @return bool|int*/ public static function update(string $table, array $values, string $index, bool $raw = false) { if (!count($values)) { return false; } if (!isset($index) || empty($index)) { return false; } $sets = $bindings = []; $updateSql= "UPDATE `" . config('database.connections.mysql.prefix').$table . "` SET " ; $data = array_keys($values[0]); $data = array_diff($data,[$index]); foreach ($data as $field) { $setSql = '`' . $field . '` = (CASE '; foreach ($values as $key => $val) {if($raw){ //特殊處理,給需要自增的欄位用 $setSql .= 'WHEN `' . $index . '` = ? THEN '.$field.'+? '; }else{ $setSql .= 'WHEN `' . $index . '` = ? THEN ? '; } $value = (is_null($val[$field]) ? 'NULL' : $val[$field]); $bindings[] = $val[$index]; $bindings[] = $value; } $setSql .= 'ELSE `'.$field.'` END) '; $sets[] = $setSql; } $updateSql .= implode(', ',$sets); $whereIn = array_column($values,$index,null); $bindings = array_merge($bindings,$whereIn); $whereIn = rtrim(str_repeat('?,',count($whereIn)),','); $query = rtrim($updateSql,', ') . " WHERE `$index` IN(" . $whereIn . ");"; return DB::update($query,$bindings); } }
使用方法如下:
<?php use App\Utils\UpdateBatch; class A{ public function b(){ $updateArr[] = [ 'id'=>1, 'b' => 2, 'c' => 3, ]; //批量更新 $index = 'id';//以此key為條件更新 $table_name = 'tableName';//要更新的表 $raw = true;//非必傳,傳true,則sql類似update tableName set b=b+2;不傳或者false還是走繫結值。 UpdateBatch::update($table_name, $updateArr, $index,$raw); } }
文章摘自:https://mp.weixin.qq.com/s/gqTbvX3xeA9EgXKDO29lAw