MySQL批量更新数据库PHP代码

6 篇文章 0 订阅
3 篇文章 0 订阅

PHP语言进行批量更新数据库数据方法:MySQL批量更新数据第一种方式:

/**
* 源码
*/
function batch_update($table_name='table',$data=array(),$field=''){
    if(!$table_name||!$data||!$field){
        return false;
    }else{
        $sql='UPDATE '.$table_name;
    }
    $con=array();
    $con_sql=array();
    $fields=array();
    foreach ($data as $key => $value) {
        $x=0;
        foreach ($value as $k => $v) {
            if($k!=$field&&!$con[$x]&&$x==0){
                $con[$x]=" set {$k} = (CASE {$field} ";
            }elseif($k!=$field&&!$con[$x]&&$x>0){
                $con[$x]=" {$k} = (CASE {$field} ";
            }
            if($k!=$field){
                $temp=$value[$field];
                $con_sql[$x].= " WHEN '{$temp}' THEN '{$v}' ";
                $x++;
            }

        }

        $temp=$value[$field];
        if(!in_array($temp,$fields)){
            $fields[]=$temp;
        }
    }

    $num=count($con)-1;
    foreach ($con as $key => $value) {
        foreach ($con_sql as $k => $v) {
            if($k==$key&&$key<$num){
                $sql.=$value.$v.' end),';
            }elseif($k==$key&&$key==$num){
                $sql.=$value.$v.' end)';
            }

        }

    }

    $str=implode(',',$fields);
    $sql.=" where {$field} in({$str})";
    $model = new \app\common\model\Schedule();
    $res= $model->execute($sql);
    return $res;

}

//测试一

function test(){
    $update_array=array();
    for ($i=2; $i <7 ; $i++) {
        $data=array();
        $data['id']=$i;
        $data['memeber_type']=2;
        $data['memeber_type_state']=1;
        $update_array[]=$data;
    }
    $res=batch_update('yl_member',$update_array,id);
    var_dump($res);
}

第二种方法:mysql批量更新

<?php
//update批量更新数据表数据PHP源码:
/**
 * 批量更新
 * @param $data array 待更新的数据,二维数组格式
 * @param array $params array 值相同的条件,键值对应的一维数组
 * @param string $field string 值不同的条件,默认为id
 * @return bool|string
 */
function batchUpdate($data, $field, $params = [])
{
   if (!is_array($data) || !$field || !is_array($params)) {
      return false;
   }

    $updates = parseUpdate($data, $field);
    $where = parseParams($params);

    // 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中
    // array_column()函数需要PHP5.5.0+,如果小于这个版本,可以自己实现,
    // 参考地址:http://php.net/manual/zh/function.array-column.php#118831
    $fields = array_column($data, $field);
    $fields = implode(',', array_map(function($value) {
        return "'".$value."'";
    }, $fields));

    $sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s", 'post', $updates, $field, $fields, $where);

   return $sql;
}

/**
 * 将二维数组转换成CASE WHEN THEN的批量更新条件
 * @param $data array 二维数组
 * @param $field string 列名
 * @return string sql语句
 */
function parseUpdate($data, $field)
{
    $sql = '';
    $keys = array_keys(current($data));
    foreach ($keys as $column) {

        $sql .= sprintf("`%s` = CASE `%s` \n", $column, $field);
        foreach ($data as $line) {
            $sql .= sprintf("WHEN '%s' THEN '%s' \n", $line[$field], $line[$column]);
        }
        $sql .= "END,";
    }

    return rtrim($sql, ',');
}

/**
 * 解析where条件
 * @param $params
 * @return array|string
 */
function parseParams($params)
{
   $where = [];
   foreach ($params as $key => $value) {
      $where[] = sprintf("`%s` = '%s'", $key, $value);
   }
   
   return $where ? ' AND ' . implode(' AND ', $where) : '';
}

 第三种:ThinkPHP

/**
     * 批量更新
     * @param $data array 待更新的数据,二维数组格式
     * @param array $params array 值相同的条件,键值对应的一维数组
     * @param string $field string 值不同的条件,默认为id
     * @return bool|string
     * @author 风中回音 <wangxu0106@foxmail.com>
     * @time   2020-09-16
     */
    public function batchUpdate($data, $field, $params = [])
    {
        if (!is_array($data) || !$field || !is_array($params)) {
            return false;
        }
        $updates    = $this->parseUpdate($data, $field);
        $where      = $this->parseParams($params);
        // 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中
        $fields = array_column($data, $field);
        $fields = implode(',', array_map(function($value) {
            return "'".$value."'";
        }, $fields));
        $sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s",'sx_playback', $updates, $field, $fields, $where);
        $res = $this->playBackModel->execute($sql);
        return $res;
    }

    /**
     * 将二维数组转换成CASE WHEN THEN的批量更新条件
     * @param $data array 二维数组
     * @param $field string 列名
     * @return string sql语句
     * @author 风中回音 <wangxu0106@foxmail.com>
     * @time   2020-09-16
     */
    public function parseUpdate($data, $field)
    {
        $sql = '';
        $keys = array_keys(current($data));
        foreach ($keys as $column) {
            $sql .= sprintf("`%s` = CASE `%s` \n", $column, $field);
            foreach ($data as $line) {
                $sql .= sprintf("WHEN '%s' THEN '%s' \n", $line[$field], $line[$column]);
            }
            $sql .= "END,";
        }
        return rtrim($sql, ',');
    }

    /**
     * 解析where条件
     * @param $params
     * @return array|string
     * @author 风中回音 <wangxu0106@foxmail.com>
     * @time   2020-09-16
     */
    public function parseParams($params)
    {
        $where = [];
        foreach ($params as $key => $value) {
            $where[] = sprintf("`%s` = '%s'", $key, $value);
        }
        return $where ? ' AND ' . implode(' AND ', $where) : '';
    }

:::::如果数据表中有唯一索引,也可以使用是thinkphp的saveALL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值