多字段数据更新,大致可以分为如下三种情况:
- 原生sql并且是请求参数字段映射的多字段更新
- laravel框架请求参数字段就对应表中字段的多字段更新(这种有漏洞风险)
- laravel框架请求参数字段和表中字段存在字段映射的多字段更新
原生sql并且是请求参数字段映射的多字段更新
如何接收一个数组,从而完成多个字段的数据更新,如下所示是请求参数数组$request:
Array (
[ss] => KfhpRc1ASgQX2zwTkuecvBq4yfDUQD5W
[name] => 徐盼盼
[sex] => 1
[blood] => AB
[birthday] => 2015-10-23 17:36:28
[birth_place] => 610113
[live_place] => 610113
[live_placeinfo] => 陕西省西安市蓝海大厦
[skill] => 看病
[clock] => 1
[user_id] => 25040005
[mobile] => 18391429660
)
映射规则:
$newparams = array ( //设置接收的参数字段跟数据表中字段的映射关系数组
"birthday"=>"birthday",//出生时间,格式为年月日时
"birth_place"=>"birth_place",//出生地详细地址
"live_place"=>"live_province_id",//现居住地省份,格式为编码
"live_placeinfo"=>"live_place", //现居住地其他详细地址
"blood"=>"blood_id",//血型,格式为编码
"sex"=>"sex_id",//性别
"skill"=>"skills",
"clock"=>"lifeclock",//是否启动生命时钟,0代表未启动,1代表启动(必填)
);
根据映射规则过滤空字符串,并且拼装成原生更新数据所要的那种字符串格式:
$sqlValue = array ();
foreach ( $v as $key => $value ) { //$v 表示传递上来的参数数组
if (isset ( $newparams [$key] ) && $value !='') { //表示传递上来的参数值不能为空,如果为空则在这里进行过滤掉
// 如果为医院进行拆分
array_push ( $sqlValue, $newparams [$key] . "='" . $value . "'" );
}
}
打印输出数组print_r($sqlValue);die();
Array (
[0] => sex_id='1'
[1] => blood_id='AB'
[2] => birthday='2015-10-23 17:36:28'
[3] => birth_place='610113'
[4] => live_province_id='610113'
[5] => live_place='陕西省西安市蓝海大厦'
[6] => skills='看病'
[7] => lifeclock='1'
)
然后执行后续步骤,判空操作,以及实现真正的原生sql更新:
//判断传递上来的参数是否为空
if (count ( $sqlValue ) <= 0) {
return true;
}
//然后执行下面的代码
$sql ="update sky_user_extend_info set " . implode(",",$sqlValue) . " where user_id = '$id'"; //拼装的sql语句
$result = $this->conn->execute ( $sql ) ? true : false;
//执行implode(",",$sqlValue)这函数后的结果如下所示:(是以逗号分隔开的字符串)
sex_id='1',blood_id='AB',birthday='2015-10-23 17:36:28',birth_place='610113' ,live_province_id='610113',live_place='陕西省西安市蓝海大厦', skills='看病' ,lifeclock='1'
laravel框架请求参数字段就对应表中字段的多字段更新(这种有漏洞风险)
这种情况是: 请求的参数字段名和表中字段名一一对应(一模一样)的情况下使用该方法,例如请求参数数组$request如下所示:
Array
(
[ss] => 6k5JyT3Haw9xvFAHACTEP8IazLl0EJ2I
[order_id] => 146961473390995523
[body] => 1
[symptom] => 酸痛,胀痛;
[level] => 1
[course] => 1
[limited] => 1
[influence_aggravation] => 加重
[influence_lighten] =>
[follow_symptom] => 伴随着头痛
[ask_id] =>
)
那么我们仅仅只需要经过如下步骤操作把空字符串以及不属于数据表中的字段的参数过滤掉,然后执行更新即可。
$data = $request; //请求的参数(需要被更新的数据)
foreach($data as $k=>$v){
//把值为空的数据过滤掉
if(empty($v)){
unset($data[$k]);
}
//如果不是数据表中对应的字段,那么也过滤掉,后面数组中的字段是该表允许被更新的字段
if(!in_array($k,['symptom','level','course','limited'])){
unset($data[$k]);
}
}
//如果过滤后的值为空,那么就没有要更新的数据
if(empty($data)){
return 3;//没有要更新的数据
}
//执行更新操作
$result = DB::table('report_dmzy_ask_info')
->where('order_id',$request['order_id'])
->where('body',$request['body'])
->update($data);
laravel框架请求参数字段和表中字段存在字段映射的多字段更新
如果请求的字段名和该表中的字段名是映射关系,而不是一一对应(一模一样)的情况下,同样的请求参数数组$request 如下所示:
Array
(
[ss] => 6k5JyT3Haw9xvFAHACTEP8IazLl0EJ2I
[order_id] => 146961473390995523
[body] => 1
[symptom] => 酸痛,胀痛;
[level] => 1
[course] => 1
[limited] => 1
[influence_aggravation] => 加重
[influence_lighten] =>
[follow_symptom] => 伴随着头痛
[ask_id] =>
)
接着我们就应该确定一下请求参数字段和数据库表中字段的映射关系,如下所示:
//我们把请求参数字段和数据表中字段做的映射关系如下:
$newParams = array(
"symptom"=>"symptom222",
"level"=>"level222",
"course"=>"course222",
"limited"=>"limited222",
"influence_aggravation"=>"influence_aggravation222",
"influence_lighten"=>"influence_lighten222",
"follow_symptom"=>"follow_symptom222"
);
接下来我们就通过映射关系把有用的参数值过滤出来,并且把空的值和请求参数中的脏数据(也就是乱写的键,而非我们参数列表指定的键)过滤掉,并且完成数据的更新操作,具体过程如下所示:
$data = [];
foreach($request as $key=>$value){
//表示上传的字段值不能为空,为空的则被过滤掉
if(isset($newParams[$key]) && $value != ''){
$data[$newParams[$key]] = $value;//$newParams[$key]表示$key映射后的数据表的字段名
}
}
经过如上步骤我们打印一下,处理后的直接可以用于更新的数据如下所示:
print_r($data);die();
Array
(
[symptom222] => 酸痛,胀痛;
[level222] => 1
[course222] => 1
[limited222] => 2
[influence_aggravation222] => 加重
[follow_symptom222] => 伴随着头痛
)
最后我们只需要判断需要更新的数据是不是为空,以及完成最终的更新即可:
//如果过滤后的值为空,那么就没有要更新的数据
if(empty($data)){
return 3;//没有要更新的数据
}
//执行更新操作
$result = DB::table('report_dmzy_ask_info')
->where('order_id',$request['order_id'])
->where('body',$request['body'])
->update($data);