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

[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-23 02:04:03 | 显示全部楼层
本帖最后由 dws20057 于 2018-10-23 02:05 编辑
PHP复制代码
<?php
 
function ajax_verify()
{
    try {
        $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里的验证码
 
        if ($_SESSION['rand_token'] != $data['rand_token']) throw new Exception('非法请求!!!');
 
        unset($_SESSION['rand_token']);    // 清空这个 session token 防止再次使用
 
        if ($_SESSION['captcha'] != $data['captcha']) throw new Exception('验证码不对!!');
 
        $result = $this->memberinfo->get_memberinfo($data['username']);
        // 从数据库里读取这个用户的全部信息
        $verify_result = password_verify($data['password'], $result['password']);     // 判断密码是否正确
        // 如果密码正确
        if (!$verify_result) throw new Exception('密码错误');
 
        $_SESSION['memberid'] = $result['memberid'];
        $_SESSION['username'] = $result['username'];
        $_SESSION['realname'] = $result['realname'];
 
        ajax('可以登录了!!');
 
    } catch (Exception $e) {
        ajax($e->getMessage());
    }
}
 
 
// 创建一个helper文件,写入一个 全局ajax返回的方法,根据自己的需求定制,类似这样:
function ajax($msg)
{
    $response['msg'] = $msg;
    $CI = &get_instance();
    $ouput = $CI->output->set_content_type('application/json', 'utf8')->set_output(json_encode($response));
}
复制代码

楼主可以这样写,省点事。就像hex大神说的一样,throw 一个 Exception是个不错的方案,平常在控制器也用的比较多。
 楼主| 发表于 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 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-11 22:37:32 | 显示全部楼层
改一下吧,完全看不清楚。
 楼主| 发表于 2018-10-11 22:40:09 | 显示全部楼层
冰辉 发表于 2018-10-11 22:37
改一下吧,完全看不清楚。

正在改
发表于 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-12 00:21:32 | 显示全部楼层
wenjy 发表于 2018-10-11 22:55
不用判断判断$result的么

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

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

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

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

这个不错,啥时候试试

本版积分规则