php大批量update,PHP操作MySQL批量Update的写法,各框架通用防注入版

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

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);

}

}

使用方法

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值