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

PHP操作MySQL批量Update的写法,各框架通用防注入版的更多相关文章

  1. mysql批量update更新,mybatis中批量更新操作

    在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...

  2. scrapy操作mysql/批量下载图片

    1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...

  3. mysql批量update操作时出现锁表

    https://www.cnblogs.com/wodebudong/articles/7976474.html 最近遇到一件锁表的情况,发现更新的语句where检索的字段,没有建索引,且是批量操作的 ...

  4. mysql批量update的两种方法

    today a question let me happy(抓狂) 头儿分了一个小任务,让修改循环调用dao层的那些不啦不啦不啦,鉴于之前写过批量更新的玩意,so 很快代码就修改完了,but 测的时候 ...

  5. Mybatis操作Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新

    前言            利用Mybatis批量更新或者批量插入,实际上即使Mybatis完美支持你的sql,你也得看看你操作的数据库是否完全支持,而同事,最近就遇到这样的一个坑! 问题 先带大家来 ...

  6. MySQL批量UPDATE多行记录

    UPDATE categories     SET display_order = CASE id         WHEN 1 THEN 3         WHEN 2 THEN 4        ...

  7. mybatis批量update操作的写法,及批量update报错的问题解决方法

    mybatis的批量update操作写法很简单,如下: public interface YourMapper extends BaseMapper<YourExt> { void upd ...

  8. Mysql 批量更新update的表与表之间操作

    Mysql 批量更新update的表与表之间操作 一.方法一 使用User2表数据更新User表: update User as a ,User2 as b set a.role_id=b.set_v ...

  9. mysql实战之 批量update

    mysql实战之批量update 现阶段我们的业务量很小,要对admin_user表中的relationship字段进行更新,指定id是409.已知409是公司内的一服务中心,需要把该服务中心放到区代 ...

  10. MyBatis魔法堂:各数据库的批量Update操作

    一.前言   MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...

随机推荐

  1. Ubuntu22 vim配置

    插件管理器 vim-plug # 下载插件管理器 sh -c 'curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githu ...

  2. ERA5气压层数据驱动WRF的一些问题

    感谢Dawn的建议,兰溪之水的WRF教程 参考了一些经验,并结合实际后,成功用ERA5驱动WRF.实际上,用ERA5数据驱动WRF的方法和用ERA-Interim 数据驱动WRF极其类似. 总结几点是 ...

  3. wake on lan sender 2.0.8

    局域网 远程关机

  4. vue-用户管理系统

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. @order(1)

    @order(num),数字表示加载顺序 1.AOP加载顺序(切面加载顺序) 2.配置类加载顺序

  6. hover状态下改变图片颜色的方式 悬停图片切换;css变量;悬停svg图片改变颜色;VUE

    由外部json文件,按照配置方式引入图片路径时,需要一些值得注意的语法来动态引入和改变图片 1.图片路径设置 ,按照img标签动态引入图片 <img src=''/> 路径不引入变量,此时 ...

  7. C++ NRV优化

    NRV,named return value 某个函数返回一个对象时,在外部接收 A a = Fun(); 会调用复制构造函数 会损失性能 为何不能将函数Fun定义成传入引用a,然后直接在a上进行操作 ...

  8. TinyMapper使用 对象映射框架

    方便的进行对象转换,仅作使用笔记 https://www.cnblogs.com/arvinzhang/p/8282922.html 例子: var result = new List<Equi ...

  9. Hide-and-Seek: Forcing a Network to be Meticulous for Weakly-Supervised Object and Action Localization概述

    0.前言 相关资料: paper 网站 论文解读(知乎,CSDN) 论文基本信息: 领域:弱监督动作定位 发表时间:ICCV2017 1.针对的问题 大多数网络只识别图像最具有鉴别力的部分,不是所有相 ...

  10. Java流程控制之break、continue、goto

    break.continue break在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) co ...