php 组合 mYSql CASE WHERE 多字段 批量更新 s…
2018-06-22 05:34:46来源:未知 阅读 ()
1、概述
转眼到18年了,从大二暑假到软件公司到至今,也满一年了,从未发表过文章。今天且记录这个功能。
作为一个刚入门的程序员,代码存不规范,代码中有错误,请各位看到本文章的大神们指点,在下感激不尽
2、代码
1 /** 2 * 组合批量更新sql 3 * @param $aPkIds 主键id的值 4 * @param array $afield 更新字段数组 5 * @param array $data 数据 6 * @param $aTable 表信息 7 * @return mixed 8 */ 9 private function updateAll($aPkIds,$afield=[],$data=[],$aTable){ 10 11 $pxIdStr=is_array($aPkIds)?implode(',', $aPkIds):$aPkIds; 12 13 if(empty($pxIdStr)||empty($afield)||empty($data)){ 14 echo '$pkId,$afield,$data不能为空'; 15 exit; 16 } 17 18 //是否传入表主键id和表名称 19 if(empty($aTable['pkId'])||empty($aTable['table_name'])){ 20 $returnData['msg']='pkId,table_name不能为空'; 21 exit; 22 } 23 24 $afieldSql=[]; 25 //组合批量更新字段sql 26 foreach ($data as $dataItem){ 27 if(empty($dataItem['id'])){ 28 echo '更新主键id为空,请核对数据后重试'; 29 exit; 30 } 31 //循环组合更新字段更新值 32 foreach ($afield as $afieldKey=>$afieldItem){ 33 //移除运’+‘算符 34 $afieldItemNew =trim(preg_replace('/\+/',"", $afieldItem)); 35 if(!array_key_exists($afieldItemNew,$dataItem)){ 36 echo '未找到需要更新的键值'; 37 exit; 38 } 39 $tempField=strstr($afieldItem,'+')==true?$afieldItem:''; //如果是运算更新 THEN 字段名 + 更新值 否则 THEN 更新值 40 $afieldSql[$afieldItem].='WHEN '.$dataItem['id'].' THEN '.$tempField.' '.$dataItem[$afieldItemNew].' '; 41 } 42 } 43 44 //组合批量更新头和尾 45 $updateSql= "UPDATE ".TAB_PF.$aTable['table_name'].' '; 46 $sql=''; 47 $connector=count($afieldSql)>0?',':'SET '; //更新多个字段使用, 48 49 //组合多个字段更新sql片段 50 foreach ($afieldSql as $afieldSqlKey=>$afieldSqlItem){ 51 //移除运算符 52 $updateField =trim(preg_replace('/\+/',"", $afieldSqlKey)); 53 $sql.=$connector.$updateField.' = CASE '.$aTable['pkId'].' '.$afieldSqlItem.'END'; 54 } 55 56 $sql=count($afieldSql)>0?' SET '.ltrim($sql,','):$sql; //多个字段 $sql变量 第一个字段加上 “SET” 并移除 第一个字段前面的"," 57 $updateSql.=$sql.' WHERE '.$aTable['pkId'].' IN ('.$pxIdStr.')'; 58 unset($afieldSql); 59 return $updateSql; 60 }
3、调用
1, 单个字段
1 $data=[ 2 '0' =>[ 3 'id' => 8393, 4 'goods_number' => 5, 5 'last_update' => 1516339645, 6 ], 7 '1' =>[ 8 'id' => 8397, 9 'goods_number' => 20, 10 'last_update' => 1516339645, 11 ] 12 ]; 13 $goodsSkuStockPkIds='8393, 8397'; 14 $aUpdateField=['goods_number']; 15 $aUpdateTable=[ 16 'pkId'=>'id', 17 'table_name'=>'centerbin_goods_stock', 18 ]; 19 $this->updateAll($goodsSkuStockPkIds,$aUpdateField,$data,$aUpdateTable);
生成的sql
UPDATE 表名 SET goods_number = CASE id WHEN 8393 THEN 5 WHEN 8397 THEN 20 END WHERE id IN (8393, 8397)
2 多个字段
$data=[ '0' =>[ 'id' => 8393, 'goods_number' => 5, 'last_update' => 1516339645, ], '1' =>[ 'id' => 8397, 'goods_number' => 20, 'last_update' => 1516339645, ] ]; $goodsSkuStockPkIds='8393, 8397'; $aUpdateField=['goods_number','last_update']; $aUpdateTable=[ 'pkId'=>'id', 'table_name'=>'centerbin_goods_stock', ]; $this->updateAll($goodsSkuStockPkIds,$aUpdateField,$data,$aUpdateTable);
生成的sql
UPDATE 表名 SET goods_number = CASE id WHEN 8393 THEN 5 WHEN 8397 THEN 20 END, last_update = CASE id WHEN 8393 THEN 1516339645 WHEN 8397 THEN 1516339645 END WHERE id IN (8393, 8397)
4、结束
下面这个,不知到怎么删除了
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash