API登录异常求助:无报错直接返回首页问题排查
登录程序登录失败问题排查
我需要开发一个登录程序,用户名和密码从API服务获取,level和id_session从数据库读取,但目前无法完成登录,没有任何报错信息,直接返回首页。以下是相关代码:
1. Controller Login.php
function index(){ if (isset($_POST['submit'])){ if ($this->input->post() && (strtolower($this->input->post('security_code')) == strtolower($this->session->userdata('mycaptcha')))) { // Fetch username and password from API $api_url = 'https://service.undipa.ac.id/mhs.php?user=' . urlencode($this->input->post('a', TRUE)) . '&pass=' . urlencode($this->input->post('b', TRUE)) . '&api=XXXXXX'; $api_response = file_get_contents($api_url); $api_data = json_decode($api_response, true); if ($api_data && isset($api_data['username']) && isset($api_data['password'])) { $username = $api_data['username']; $password = $api_data['password']; } else { echo $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>Invalid API response!</center></div>'); redirect('administrator/home'); } // Get level and id_session from database $username_from_api = $api_data['username']; $user_data = $this->model_app->get_user_data_by_username($username_from_api); if (!$user_data) { echo $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>User not found in database!</center></div>'); redirect('administrator/home'); } // Continue with the rest of the login logic $password = $password; $cek = $this->model_app->cek_login($username, $password, 'users'); $row = $cek->row_array(); $total = $cek->num_rows(); if ($total > 0){ $this->session->set_userdata('upload_image_file_manager',true); $this->session->set_userdata(array('username'=>$row['username'], 'level'=>$user_data['level'], 'id_session'=>$user_data['id_session'])); redirect('administrator/home'); }else{ echo $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>Username dan Password Salah!!</center></div>'); redirect('administrator/home'); } }else{ echo $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>Security Code salah!</center></div>'); redirect('administrator/home'); } }else{ if ($this->session->level!=''){ redirect('administrator/home'); }else{ $this->load->helper('captcha'); $vals = array( 'img_path' => './captcha/', 'img_url' => base_url().'captcha/', 'font_size' => 17, 'img_width' => '320', 'img_height' => 33, 'border' => 0, 'word_length' => 5, 'expiration' => 7200 ); $cap = create_captcha($vals); $data['image'] = $cap['image']; $this->session->set_userdata('mycaptcha', $cap['word']); $data['title'] = 'Users › Log In'; $this->load->view('administrator/view_login',$data); } } }
2. 登录视图代码片段
<div class="login-box"> <div class="login-logo"> <a href="#"><b>USERS</b> Login</a> </div> <!-- /.login-logo --> <div class="card"> <div class="card-body login-card-body"> <p class="login-box-msg">Sign in to start your session</p> <?php echo $this->session->flashdata('message'); echo form_open($this->uri->segment(1).'/index'); ?> <div class="input-group mb-3"> <input type="text" class="form-control" name='a' placeholder="Username" required> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-envelope"></span> </div> </div> </div> <div class="input-group mb-3"> <input type="password" class="form-control" name='b' placeholder="Password" required> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-lock"></span> </div> </div> </div> <div class="input-group mb-3"> <?php echo $image; ?> </div> <div class="input-group mb-3"> <input type="text" class="form-control" name='security_code' placeholder="Security Code" required> </div> <div class="row"> <div class="col-8"> <div class="icheck-primary"> <a data-dismiss="modal" aria-hidden="true" data-toggle='modal' href='#lupapass' data-target='#lupapass'>I forgot my password</a> </div> </div> <!-- /.col --> <div class="col-4"> <button type="submit" name='submit' class="btn btn-primary btn-block">Sign In</button> </div> <!-- /.col --> </div> </form> </div> <!-- /.login-card-body --> </div> </div>
3. 登录验证函数
public function cek_login($username, $password, $table) { if (!empty($username) && !empty($password)) { $password = $password; return $this->db->query("SELECT * FROM $table WHERE username='".$this->db->escape_str($username)."' AND password='".$this->db->escape_str($password)."' AND blokir='N'"); } else { echo $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>Invalid username or password!</center></div>'); redirect($this->uri->segment(1) . '/index'); } }
4. Home函数
function home(){ if ($this->session->level=='admin'){ $this->template->load('administrator/template','administrator/include/view_home_admin'); }else{ $data['users'] = $this->model_app->view_where('users',array('username'=>$this->session->username))->row_array(); $data['modul'] = $this->model_app->view_join_one('users','users_modul','id_session','id_umod','DESC'); $this->template->load('administrator/template','administrator/include/view_home_users',$data); } }
问题排查及修复方案
1. API请求未做失败处理
file_get_contents可能因服务器配置(如allow_url_open关闭)或网络问题返回false,但当前代码未处理这种情况,直接进入json解码会得到null,触发API响应无效的跳转。
- 修复:添加请求失败判断,改用cURL提升兼容性:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $api_response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($api_response === false || $http_code != 200) { $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>API请求失败,状态码:'.$http_code.'</center></div>'); redirect('administrator/home'); } $api_data = json_decode($api_response, true);
2. Flashdata设置错误
所有echo $this->session->set_flashdata(...)都是错误写法,set_flashdata不需要echo,多余的输出会干扰session设置和跳转逻辑。
- 修复:去掉echo,直接调用:
// 错误写法 echo $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>Invalid API response!</center></div>'); // 正确写法 $this->session->set_flashdata('message', '<div class="alert alert-danger"><center>API响应无效!</center></div>');
3. 冗余的数据库密码验证
API已经验证了用户名密码的有效性,无需再用cek_login去数据库重复验证(数据库中密码可能是哈希值,和API返回的明文不匹配)。
- 修复:去掉数据库验证步骤,直接使用API和数据库获取的信息设置session:
// 移除以下冗余代码 // $cek = $this->model_app->cek_login($username, $password, 'users'); // $row = $cek->row_array(); // $total = $cek->num_rows(); // 直接设置session $this->session->set_userdata('upload_image_file_manager',true); $this->session->set_userdata(array( 'username' => $username_from_api, 'level' => $user_data['level'], 'id_session' => $user_data['id_session'] )); redirect('administrator/home');
4. Session读取方式错误
CodeIgniter中应使用$this->session->userdata('key')读取session,而非直接$this->session->key。
- 修复Home函数中的session读取:
function home(){ $level = $this->session->userdata('level'); $username = $this->session->userdata('username'); if ($level == 'admin'){ $this->template->load('administrator/template','administrator/include/view_home_admin'); }else{ $data['users'] = $this->model_app->view_where('users',array('username'=>$username))->row_array(); $data['modul'] = $this->model_app->view_join_one('users','users_modul','id_session','id_umod','DESC'); $this->template->load('administrator/template','administrator/include/view_home_users',$data); } }
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

