使用别人的扩展遇到了问题,发现没有做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. .netcore webapi的返回值和过滤器

    1.返回值. 1.1直接返回数据 1.2 数据+状态码 返回这种类型IActionResult 可以使用return OK(T).return NotFound(T) 1.3前两种的混合使用Actio ...

  2. Linux 释放内存及占用较高问题排查

    1. 查看内存情况 #按 k 查看 free #按兆M查看 free -m total:总计物理内存的大小. used:已使用多大. free:可用有多少. Shared:多个进程共享的内存总额. B ...

  3. 一 MySQL的架构与历史1.1--1.4

    1.1 MySQL逻辑架构 最上层的服务并不是 MySQL 所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构.比如连接处理.授权认证.安全等等. 第二层架构是MySQL比较有意思的 ...

  4. 服务器5M带宽下载速计算

    5M贷款的服务器实际下载速度不是5M每秒,而是640KB/S,是由于服务商口中的宽带指的是bit(比特),而下载速度使用的单位是Byte(字节),1Byte(字节)=8bit(比特),所以,宽带和下载 ...

  5. C++ Error:C2011: 'struct' type redefinition

    C++ Error:C2011: 'struct' type redefinition        在c语言中,对同一个变量或者函数进行多次声明是不会报错的.所以如果h文件里只是进行了声明工作,即使 ...

  6. okHttp3源码简要分析

    首先看一下使用, public static void main(String[] args) throws IOException { OkHttpClient client = new OkHtt ...

  7. 项目启动报错:关于modals以及node版本相关

    programme1: 1.代码用master分支的. 2. 删除node_module ,  yarn lock 文件,package-lock文件. 3. 用 npm install 或者 yar ...

  8. window server 2012R2部署asp.net core项目应用程序池自动停止

    当在windows  server 2012R2上部署asp.net core项目时,需要安装the Hosting Bundle,但当我们安装完dotnet-hosting后,浏览站点应用程序池会自 ...

  9. Qt6以上安装速度慢解决-国内镜像加速

    1.安装抓包软件Fiddler最新版本 Fiddler30天试用 2.在软件下方输入栏内粘贴以下命令 urlreplace download.qt.io mirrors.tuna.tsinghua.e ...

  10. centos删除安装vsftpd

    准备工作 1.centos 卸载vsftpd 删除原有的vsftpd(卸载前先关闭 vsftpd: systemctl stop vsftpd)[root@localhost ~]# rpm -aq ...