使用别人的扩展遇到了问题,发现没有做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

 posted on 2022-05-17 11:10  三哥-Noble  阅读(163)  评论(0)    收藏  举报
TOP