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部分的操作就简单了. ...
随机推荐
- GNOME 窗口添加最大化、最小化按钮
1.安装工具 使用终端命令安装优化工具 yum install gnome-tweak-tool 2.配置 gnome-tweak-tool 安装完毕后,在应用程序的"工具"中找到 ...
- BigDecimal精度等注意事项
1.BigDecimal运算时尽量传入字符串, 反例: BigDecimal num=new BigDecimal(75); num.multiply(new BigDecimal(0.5)).set ...
- ERA-Interim 的变量TCW和VIWV可降水量
可降水量(Precipitable water) 气象上有一个名词"可降水量"(Precipitable water),可以用来衡量大气的水含量. 其公式为 \(W=\frac{1 ...
- C语言-Windows定时关机小程序
整理文件发现以前写的定时关机小程序(Windows下) 1-效果 2-程序 #include <stdio.h> #include <stdlib.h> #include &l ...
- 在C++创建动态数组
计算首行两数相加 #include <iostream>11 #include <vector> using namespace std; int main() { vecto ...
- 2020icpc济南 - A
组合数学 + 高斯消元 [A-Matrix Equation_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南) (nowcoder.com)](https://codeforces.c ...
- mybati之sql集合
mybatis 详解(五)------动态SQL - YSOcean - 博客园 (cnblogs.com) mybatis参数注入: 根据参数名称 使用#{} 注入参数 <insert id= ...
- 2022-3-17内部群每日三题-清辉PMP
1.一个项目预算为6000万美元,预计需要24个月才能完成.12个月后,该项目完成了60%,并使用了3500美元.那么预算和进度的状态如何? A.符合预算,并超前于进度 B.超出预算,但超前于进度 C ...
- iOS 12.3 - iOS 13.X 爱思助手越狱教程
原文链接 本教程使用工具为爱思助手 Mac 版,Windows 电脑可以安装"黑苹果"系统后,在"黑苹果"系统内安装爱思助手再进行操作. 支持设备:iPhone ...
- 在安装SDK8.1和Visual Studio 2017时,提示“已停止工作”
解决办法:在微软官网下载 .net framework 的最新的开发包(Build apps - Dev Pack),重新安装后问题得到解决. https://dotnet.microsoft.com ...