andyzu 发表于 2018-10-11 22:35:40

求助,如何减少if嵌套?

本帖最后由 andyzu 于 2018-10-11 22:41 编辑

各位大神好!这是我写的一个ajax的向服务器的验证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嵌套,如何能简化?请各位大神给出建议!谢谢!!!!!


dws20057 发表于 2018-10-23 02:04:03

本帖最后由 dws20057 于 2018-10-23 02:05 编辑

<?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是个不错的方案,平常在控制器也用的比较多。

andyzu 发表于 2018-10-11 22:44:23

      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;
      }

我是否可以这样写,总感觉怪怪的

Hex 发表于 2018-10-11 23:53:43

可以用抛异常的方式:

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

改一下吧,完全看不清楚。

andyzu 发表于 2018-10-11 22:40:09

冰辉 发表于 2018-10-11 22:37
改一下吧,完全看不清楚。

正在改

wenjy 发表于 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 '失败原因';}
}

andyzu 发表于 2018-10-12 00:21:32

wenjy 发表于 2018-10-11 22:55
不用判断判断$result的么

肯定要判断,我只是说这种写法行不行

andyzu 发表于 2018-10-12 00:21:48

Hex 发表于 2018-10-11 23:53
可以用抛异常的方式:

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

学习了,我研究并理解一下

连普科技 发表于 2018-10-18 10:42:12

Hex 发表于 2018-10-11 23:53
可以用抛异常的方式:

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

这个不错,啥时候试试
页: [1] 2
查看完整版本: 求助,如何减少if嵌套?