1. 程式人生 > 其它 >PHP操作MySQL批量Update的寫法,各框架通用防注入版

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