php构造mysql批量更新数据

本文介绍了一种使用PHP和SQL批量更新数据库中特定用户邮箱的方法,通过解析字符串并构造动态SQL语句实现高效的数据更新。

原理为:

UPDATE account SET `email` = CASE `user_name` 
WHEN 'a' THEN 'aa@hotmail.com' 
WHEN 'b' THEN 'bb@hotmail.com' 
WHEN 'c' THEN 'cc@163.com' 
END WHERE `user_name` IN ('a','b','c') 

代码格式表现为:

public function actionUpdateemail(){

        $str = 'a	aa@163.com
b	bb@hotmail.com
c	cc@163.com';

        if (isset($_REQUEST['str'])) $str = $_REQUEST['str'];
        $dataArr = preg_split('/\s/',$str);
        $dataArr = array_filter($dataArr);
        $dataArrs = array_chunk($dataArr,2);

        $datas = [];
        $i = 0;
        foreach ($dataArrs as $arrs){
            foreach ($arrs as $kk=>$arr){
                if ($kk == 0){
                    $datas[$i]['user_name'] = $arr;
                }else{
                    $datas[$i]['email'] = $arr;
                }
            }
            $i++;
        }

        function parseUpdate($data, $field)
        {
            $sql = '';
            $keys = array_keys(current($data));
            array_shift($keys);
            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, ',');
        }

        function parseParams($params)
        {
            $where = [];
            foreach ($params as $key => $value) {
                $where[] = sprintf("`%s` = '%s'", $key, $value);
            }

            return $where ? ' AND ' . implode(' AND ', $where) : '';
        }

        function batchUpdate($data, $field, $params = [])
        {
            if (!is_array($data) || !$field || !is_array($params)) {
                return false;
            }

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

            // 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中
            $fields = array_column($data, $field);
            $fields = implode(',', array_map(function($value) {
                return "'".$value."'";
            }, $fields));

            $table = EbayAccount::staticModel()->tableName();
            $sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s", $table, $updates, $field, $fields, $where);

            return $sql;
        }

        $sql = batchUpdate($datas, 'user_name');

        if ($_REQUEST['print']){
            echo $sql;exit();
        }

        $res = Account::staticModel()->getDbConnection()->createCommand($sql)->execute();
        var_dump($res);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值