You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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', '&lt;div class=&quot;alert alert-danger&quot;&gt;&lt;center&gt;Invalid username or password!&lt;/center&gt;&lt;/div&gt;');
        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', '&lt;div class=&quot;alert alert-danger&quot;&gt;&lt;center&gt;Invalid API response!&lt;/center&gt;&lt;/div&gt;');
// 正确写法
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:35:53