使用别人的扩展遇到了问题,发现没有做SQL注入的处理。我又写了个轮子,根据自己需求扩展了下,有需要的小伙伴可以直接取用。

这里就直接粘贴源码了,会用PHPD ,基本都会如何把它运用到各个框架里的。

本次项目使用的是laravel框架,此框架里没有封装好的批量更新的方法,所以很多时候在业务要运用到的时候都是自己去写一个。下面代码:

  1. <?php
  2. namespace App\Utils;
  3.  
  4. use Illuminate\Support\Facades\DB;
  5. class UpdateBatch
  6. {
  7. /***
  8. * @param string $table 表名
  9. * @param array $values 更新字段
  10. * @param string $index key值
  11. * @param bool $raw 是否特殊处理
  12. * @return bool|int
  13. */
  14. public static function update(string $table, array $values, string $index, bool $raw = false)
  15. {
  16. if (!count($values)) {
  17. return false;
  18. }
  19.  
  20. if (!isset($index) || empty($index)) {
  21. return false;
  22. }
  23.  
  24. $sets = $bindings = [];
  25. $updateSql = "UPDATE `" . config('database.connections.mysql.prefix').$table . "` SET " ;
  26.  
  27. $data = array_keys($values[0]);
  28. $data = array_diff($data,[$index]);
  29. foreach ($data as $field) {
  30. $setSql = '`' . $field . '` = (CASE ';
  31. foreach ($values as $key => $val) {
  32. if($raw){
  33. //特殊处理,给需要自增的字段用
  34. $setSql .= 'WHEN `' . $index . '` = ? THEN '.$field.'+? ';
  35. }else{
  36. $setSql .= 'WHEN `' . $index . '` = ? THEN ? ';
  37. }
  38. $value = (is_null($val[$field]) ? 'NULL' : $val[$field]);
  39. $bindings[] = $val[$index];
  40. $bindings[] = $value;
  41. }
  42. $setSql .= 'ELSE `'.$field.'` END) ';
  43. $sets[] = $setSql;
  44. }
  45. $updateSql .= implode(', ',$sets);
  46.  
  47. $whereIn = array_column($values,$index,null);
  48. $bindings = array_merge($bindings,$whereIn);
  49. $whereIn = rtrim(str_repeat('?,',count($whereIn)),',');
  50.  
  51. $query = rtrim($updateSql,', ') . " WHERE `$index` IN(" . $whereIn . ");";
  52. return DB::update($query,$bindings);
  53. }
  54. }

使用方法如下:

  1. <?php
  2. use App\Utils\UpdateBatch;
  3. class A{
  4. public function b(){
  5. $updateArr[] = [
  6. 'id'=>1,
  7. 'b' => 2,
  8. 'c' => 3,
  9. ];
  10. //批量更新
  11. $index = 'id';//以此key为条件更新
  12. $table_name = 'tableName';//要更新的表
  13. $raw = true;//非必传,传true,则sql类似update tableName set b=b+2;不传或者false还是走绑定值。
  14. UpdateBatch::update($table_name, $updateArr, $index,$raw);
  15. }
  16. }

文章摘自: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. GNOME 窗口添加最大化、最小化按钮

    1.安装工具 使用终端命令安装优化工具 yum install gnome-tweak-tool 2.配置 gnome-tweak-tool 安装完毕后,在应用程序的"工具"中找到 ...

  2. BigDecimal精度等注意事项

    1.BigDecimal运算时尽量传入字符串, 反例: BigDecimal num=new BigDecimal(75); num.multiply(new BigDecimal(0.5)).set ...

  3. ERA-Interim 的变量TCW和VIWV可降水量

    可降水量(Precipitable water) 气象上有一个名词"可降水量"(Precipitable water),可以用来衡量大气的水含量. 其公式为 \(W=\frac{1 ...

  4. C语言-Windows定时关机小程序

    整理文件发现以前写的定时关机小程序(Windows下) 1-效果 2-程序 #include <stdio.h> #include <stdlib.h> #include &l ...

  5. 在C++创建动态数组

    计算首行两数相加 #include <iostream>11 #include <vector> using namespace std; int main() { vecto ...

  6. 2020icpc济南 - A

    组合数学 + 高斯消元 [A-Matrix Equation_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南) (nowcoder.com)](https://codeforces.c ...

  7. mybati之sql集合

    mybatis 详解(五)------动态SQL - YSOcean - 博客园 (cnblogs.com) mybatis参数注入: 根据参数名称 使用#{} 注入参数 <insert id= ...

  8. 2022-3-17内部群每日三题-清辉PMP

    1.一个项目预算为6000万美元,预计需要24个月才能完成.12个月后,该项目完成了60%,并使用了3500美元.那么预算和进度的状态如何? A.符合预算,并超前于进度 B.超出预算,但超前于进度 C ...

  9. iOS 12.3 - iOS 13.X 爱思助手越狱教程

    原文链接 本教程使用工具为爱思助手 Mac 版,Windows 电脑可以安装"黑苹果"系统后,在"黑苹果"系统内安装爱思助手再进行操作. 支持设备:iPhone ...

  10. 在安装SDK8.1和Visual Studio 2017时,提示“已停止工作”

    解决办法:在微软官网下载 .net framework 的最新的开发包(Build apps - Dev Pack),重新安装后问题得到解决. https://dotnet.microsoft.com ...