求助,如何减少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: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是个不错的方案,平常在控制器也用的比较多。
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;
}
我是否可以这样写,总感觉怪怪的 可以用抛异常的方式:
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
改一下吧,完全看不清楚。
正在改 andyzu 发表于 2018-10-11 22:44
我是否可以这样写,总感觉怪怪的
不用判断判断$result的么 本帖最后由 冰辉 于 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 '失败原因';}
} wenjy 发表于 2018-10-11 22:55
不用判断判断$result的么
肯定要判断,我只是说这种写法行不行 Hex 发表于 2018-10-11 23:53
可以用抛异常的方式:
这样的代码特别适合在控制器里使用。
学习了,我研究并理解一下 Hex 发表于 2018-10-11 23:53
可以用抛异常的方式:
这样的代码特别适合在控制器里使用。
这个不错,啥时候试试
页:
[1]
2