用户
 找回密码
 入住 CI 中国社区
搜索
查看: 247|回复: 9
收起左侧

[HELP] 求助,如何减少if嵌套?

[复制链接]
发表于 2018-10-11 22:35:40 | 显示全部楼层 |阅读模式
本帖最后由 andyzu 于 2018-10-11 22:41 编辑

各位大神好!这是我写的一个ajax的向服务器的验证PHP代码:
PHP复制代码
public function ajax_verify()    {
        $data['username'] = $this->input->post('username', TRUE);    // 获取的用户名
        $data['password'] = $this->input->post('password', TRUE);     // 获取的密码
        $data['captcha'] = $this->input->post('captcha', TRUE);          // 获取的验证码
        $data['rand_token'] = $this->input->post('csrf_name', TRUE); // 获取的随机token
        // 以下两行在实际代码中是没有的,为了方便各位理解代码,所以写上的
        $data['sess_token'] = $_SESSION['rand_token'];   // 这里是session里的随机token
        $data['sess_captcha'] = $_SESSION['captcha'];    // 这里是session里的验证码
        // 开始验证                
        // 先判断token和session里的token是否正确        
        if ($_SESSION['rand_token'] == $data['rand_token'])
        {
            unset($_SESSION['rand_token']);    // 清空这个 session token 防止再次使用            
            // 再判断验证码和session里的验证码是否正确            
            if ($_SESSION['captcha'] == $data['captcha'])
            {
                $result = $this->memberinfo->get_memberinfo($data['username']);             // 从数据库里读取这个用户的全部信息
                $verify_result = password_verify($data['password'] , $result['password']);     // 判断密码是否正确                
                // 如果密码正确
                if ($verify_result)
                {
                    $_SESSION['memberid'] = $result['memberid'];
                    $_SESSION['username'] = $result['username'];
                    $_SESSION['realname'] = $result['realname'];
                    echo '可以登录了!!';
                }else{
                    echo '密码错误!!';
                }
 
            }else{
                echo '验证码不对!!';
            }
 
        }else{
            echo '非法请求!!!';
        }
 
 
    }
复制代码


我现在的问题是,我不想搞这么多的IF嵌套,如何能简化?请各位大神给出建议!谢谢!!!!!


发表于 2018-10-11 22:37:32 | 显示全部楼层
改一下吧,完全看不清楚。
 楼主| 发表于 2018-10-11 22:40:09 | 显示全部楼层
冰辉 发表于 2018-10-11 22:37
改一下吧,完全看不清楚。

正在改
 楼主| 发表于 2018-10-11 22:44:23 | 显示全部楼层
PHP复制代码
        if ($_SESSION['rand_token'] != $data['rand_token'])
        {
            $ajax_json = $data['tips_setting']['csrf_submit_code'];
            echo json_encode($ajax_json);
            return;
        }
 
        if ($_SESSION['captcha'] != $data['captcha'])
        {
            $ajax_json = $data['tips_setting']['captcha_fail_code'];
            echo json_encode($ajax_json);
            return;
        }
复制代码


我是否可以这样写,总感觉怪怪的
发表于 2018-10-11 22:55:23 | 显示全部楼层
andyzu 发表于 2018-10-11 22:44
我是否可以这样写,总感觉怪怪的

不用判断判断$result的么
发表于 2018-10-11 23:28:46 | 显示全部楼层
本帖最后由 冰辉 于 2018-10-11 23:30 编辑

建议把登录判断过程写成控制器的私有函数,给控制器调用$this->yourfunc();
private function yourfunc()
{
  if (合法验证1===false) { return '失败结果1';}
...
  if (合法验证n===false) { return '失败结果n';}
  登录...;
  if (登录成功){return true;} else  { return '失败原因';}
}
发表于 2018-10-11 23:53:43 | 显示全部楼层
可以用抛异常的方式:
PHP复制代码
 
function demo()
{
  try
  {
    if ($is_error1)
    {
      throw new Exception('error1');
    }
 
    if ($is_error2)
    {
      throw new Exception('error2');
    }
 
    if ($is_error3)
    {
      throw new Exception('error3');
    }
 
    $output_array = ['msg' => 'ok'];
  }
  catch (Exception $e)
  {
    $output_array = ['msg' => $e->getMessage()];
  }
 
  $this->load_view('demo_view', $output_array);
}
 
复制代码

这样的代码特别适合在控制器里使用。
 楼主| 发表于 2018-10-12 00:21:32 | 显示全部楼层
wenjy 发表于 2018-10-11 22:55
不用判断判断$result的么

肯定要判断,我只是说这种写法行不行
 楼主| 发表于 2018-10-12 00:21:48 | 显示全部楼层
Hex 发表于 2018-10-11 23:53
可以用抛异常的方式:

这样的代码特别适合在控制器里使用。

学习了,我研究并理解一下
发表于 前天 10:42 | 显示全部楼层
Hex 发表于 2018-10-11 23:53
可以用抛异常的方式:

这样的代码特别适合在控制器里使用。

这个不错,啥时候试试

本版积分规则