PHP操作MySQL批量Update的写法,各框架通用防注入版
使用别人的扩展遇到了问题,发现没有做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的写法,各框架通用防注入版的更多相关文章
- mysql批量update更新,mybatis中批量更新操作
在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...
- scrapy操作mysql/批量下载图片
1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...
- mysql批量update操作时出现锁表
https://www.cnblogs.com/wodebudong/articles/7976474.html 最近遇到一件锁表的情况,发现更新的语句where检索的字段,没有建索引,且是批量操作的 ...
- mysql批量update的两种方法
today a question let me happy(抓狂) 头儿分了一个小任务,让修改循环调用dao层的那些不啦不啦不啦,鉴于之前写过批量更新的玩意,so 很快代码就修改完了,but 测的时候 ...
- Mybatis操作Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新
前言 利用Mybatis批量更新或者批量插入,实际上即使Mybatis完美支持你的sql,你也得看看你操作的数据库是否完全支持,而同事,最近就遇到这样的一个坑! 问题 先带大家来 ...
- MySQL批量UPDATE多行记录
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 ...
- mybatis批量update操作的写法,及批量update报错的问题解决方法
mybatis的批量update操作写法很简单,如下: public interface YourMapper extends BaseMapper<YourExt> { void upd ...
- Mysql 批量更新update的表与表之间操作
Mysql 批量更新update的表与表之间操作 一.方法一 使用User2表数据更新User表: update User as a ,User2 as b set a.role_id=b.set_v ...
- mysql实战之 批量update
mysql实战之批量update 现阶段我们的业务量很小,要对admin_user表中的relationship字段进行更新,指定id是409.已知409是公司内的一服务中心,需要把该服务中心放到区代 ...
- MyBatis魔法堂:各数据库的批量Update操作
一.前言 MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...
随机推荐
- WPF绑定(4)
什么是绑定(Binding)? 在winform中, 我们常常会用到各种类型的赋值, 例如: button1.Text="Hello"; label.Text="Hell ...
- Vulnhub 靶机 CONTAINME: 1
Vulnhub 靶机 CONTAINME: 1 前期准备: 靶机地址:https://www.vulnhub.com/entry/containme-1,729/ kali地址:192.168.147 ...
- tfidf与bm25
https://www.cnblogs.com/johnnyzen/p/11298273.html 前言 本文主要是对TF-IDF和BM25在公式推演.发展沿革方面的演述,全文思路.图片基本来源于此篇 ...
- SATA硬盘的数据和电源接口定义(转)
现在 SATA设备越来越普及,包括STAT硬盘和光驱基本都已经是 SATA接口的了,以前的老式电源输出接口一般都是20针供主板加上4针的电源供硬盘也就是说以前的电脑电源给硬盘供电没有设计15针 SAT ...
- as8051入门
汇编例子 MAIN: MOV R0, #16 MOV R1, #16 LOOP: MOV A, R1 MOV @R0,A MOV A,0x0 MOV A, @R0 MOV SBUF, A INC R0 ...
- 【音视频】FFmpeg打开视频 | 保存图片
1.初始化FFmpeg av_register_all(); //初始化FFMPEG 调用了这个才能正常使用编码器和解码器 但是这个函数如今已经没什么用了,它的就是把你定义和系统初始化的编码器和解码器 ...
- Dashboard是什么意思 Dashboard怎么用?
Dashboard是什么意思?Dashboard怎么用?可能很多Mac用户朋友都不知道,Dashboard是苹果OS X操作系统的一大特色.是随苹果公司 Mac OS X 10.4 Tiger 操作系 ...
- 【SQL Server】获取表格插入的id(二)——newID()
现在有一个需求,插入api调用日志表.然后,发起HTTP请求()请求时,需要带入日志表的id). 简化无关的添加,SQL Server表格设计如下: CREATE TABLE mylog ( id I ...
- glibc被卸载恢复过程
问题描述:升级软件包时,rpm -e glibc --nodeps 卸载了glibc软件,glibc是系统命令库,之后一些命令不能使用,系统几近奔溃恢复步骤: 1). 挂载装系统光盘,设置从光盘启动, ...
- idea使用EasyCode集成ruoyi框架自动生成代码
1.ruoyi框架源码获取 https://gitee.com/zhangmrit/ruoyi-cloud/tree/nacos/ 2.需要ruoyi调整部分代码 public class BaseC ...