使用别人的扩展遇到了问题,发现没有做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
本文来自博客园,作者:三哥-Noble,转载请注明原文链接:https://www.cnblogs.com/Noble-zeng/p/16280049.html
posted on
浙公网安备 33010602011771号