写项目的过程中往往会遇到一个问题就是如果,被注入了怎么办?基本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);
}
}
希望对大家有所帮助