json 中缺少字段时无法更新数据库

Posted

技术标签:

【中文标题】json 中缺少字段时无法更新数据库【英文标题】:Can not update database when missing field in json 【发布时间】:2016-04-04 00:37:50 【问题描述】:

我正在制作一个 API,可以帮助用户根据输入数据更新他们的信息。但是当输入 json 有字段“密码”时,它会成功更新,但是当 json 没有这个字段时,我无法更新数据库中的数据。这是我用来更新数据的代码:

public function updateUserInfo(Request $request)
        $postData = $request->all();
        $data = json_decode($postData['postData'], true);
        if(isset($data['password']))
            $data['password'] = bcrypt($data['password']);
        
        $popData = $data['UserId'];
        unset($data['UserId']);
        $updateInfo = array();
        foreach($data as $info)
            if($info != null)
                $updateInfo[] = $info;
            
        
        $result =  DB::update(GeneralFunctions::makeUpdateString($data, 'User', ' UserId = '.$popData), $updateInfo);
        if($result != null && $result == true)
            return response()->json(['success'=>true, 'data'=>'Update Successful']);
        else
            return response()->json(['success'=>false, 'error'=>'We have encountered an error, try again later!']);
        
    

这是一切正常时的 json:

$postData = ' "UserId" : "1",   "password":"12345", "UserName": "minhkhang",  "Address": "11/200" '

这是由于缺少密码字段而导致错误的json:

$postData = ' "UserId" : "1", "UserName": "minhkhang",  "Address": "11/200" '

这是我用来使更新字符串跟随输入 json 的代码:

 public static function makeUpdateString($keyvalarr, $table, $where)
        $stringSQL = 'UPDATE '.$table. ' SET ' ;
        foreach($keyvalarr as $fieldname => $updateval)
            if($updateval != null)
                $stringSQL .= $fieldname.' = ? , ';
            
        
        $stringSQL =  substr($stringSQL, 0, -2);
        if($where != null)
            $stringSQL .= 'WHERE '.$where;
        
        return $stringSQL;
    

谢谢。

【问题讨论】:

【参考方案1】:

这里有问题的代码是:

if(isset($data['password']))
    $data['password'] = bcrypt($data['password']);

看看是什么

isset($data['password'])

在 if 语句之外返回,如果密码存在于 JSON 中并且没有给你一个听起来像你期望的问题,但是检查该语句本身是否在没有 if 的情况下为 false声明,确保它还没有跳进去,它似乎是你寻找的唯一地方'password'

【讨论】:

那么我该如何解决这个问题,我尝试使用 isset 检查此密钥是否在其他项目的数组中可用,但它工作正常。不知道为什么这会导致这个函数出现问题! 如果 JSON 中没有“密码”,它会返回什么?就其本身而言,如果您打算不使用“密码”,您是否考虑过删除整个代码部分?或者你需要使用它吗?如果你已经尝试过了,你是否考虑过当它传入 $data 到函数中时,如果 JSON 在尝试将键应用于字段时不匹配,并且运行更新?键是否与表的预期不匹配?您是否遇到任何可能有更多帮助的具体错误? 如果密码在 json 或 null 中不可用,那么我需要取消设置该密钥。如果它可用,我必须用 bcrypt 对其进行散列并再次设置为数组 在这种情况下,您可能只需要在 if 语句之后添加一个带有 unset 的 else,这样 else unset($data['password']); 您是否有机会在原始问题中发布您尝试过的内容?

以上是关于json 中缺少字段时无法更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

JSON 字段的更新不会持续到数据库

CAKEPHP 3.x - 实体更新时出错 - 即使有值,也会声明缺少字段

如何使用nodejs更新mysql json数组

java更新数据库的datatime字段

从特定 JSON 字段中提取数据,将其用作变量,并更新字段值?

更新 datagridview 时导出日志文件