代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

Codeigniter 3应用程序错误:单击浏览器的后退按钮激发signout()函数

  •  0
  • Razvan Zamfir  · 技术社区  · 7 年前

    我做了一个 注册和登录 在Codeigniter 3中的应用。我一直在努力解决这个问题:登录后,用户被重定向到主页 但是 单击浏览器的后退按钮将触发signout()函数,而不是 重定向 从登录页面到主页。

    这个 登录控制器 具有以下代码:

    class Signin extends CI_Controller {
    
      public function __construct()
      {
        parent::__construct();
      }
    
      public function index()
      {
        $this->load->view('signin');
      }
    
      public function signin()
      {  
        $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
        $this->form_validation->set_rules('password', 'Password', 'required');
        $this->form_validation->set_error_delimiters('<p class="error">', '</p>');
        if ($this->form_validation->run())
        {
          $email = $this->input->post('email');
          $password = $this->input->post('password');
          $this->load->model('Usermodel');
          $current_user = $this->Usermodel->user_login($email, $password);
          // Unset the current user's data
          if ($current_user) {
           $this->session->set_userdata(
             array(
              'user_id' => $current_user->id,
              'user_email' => $current_user->email,
              'user_first_name' => $current_user->fname,
              'is_logged_in' => TRUE
              )
             );
           redirect('home');  
         } else {
            $this->session->set_flashdata("signin_failure", "Incorrect email or password");
            redirect('signin'); 
          }
        }
        else
        {
         $this->load->view('signin');
       }
      }
    
      public function signout(){
        // Unset the current user's data
        $this->session->unset_userdata('user_id');
        $this->session->unset_userdata('user_email');
        $this->session->unset_userdata('user_first_name');
        $this->session->unset_userdata('is_logged_in');
    
        // Load the signin view
        $this->load->view('signin'); 
      }
    }
    

    在导航栏(header.php视图)中,我使用 is_logged_in 显示 Sigin公司 , 登记 注销 需要时的按钮:

    <div id="navbar" class="collapse navbar-collapse">
        <ul class="nav navbar-nav navbar-right">
          <?php if($this->session->userdata('is_logged_in')) : ?>
          <li class="dropdown">
            <a class="dropdown-toggle" data-toggle="dropdown" href="#"><span class="glyphicon glyphicon-user"></span> Welcome, <?php echo $this->session->userdata('user_first_name'); ?>
            <span class="caret"></span></a>
            </a>
            <ul class="dropdown-menu">
              <li><a href="#"><span class="glyphicon glyphicon-phone"></span> My contacts</a></li>
              <li><a href="#"><span class="glyphicon glyphicon-phone-alt"></span> All contacts</a></li>
              <li><a href="<?php echo base_url('index.php/Signin/signout'); ?>" title="Signout"><span class="glyphicon glyphicon-log-out"></span> Signout</a></li>
            </ul>
          </li>
          <?php else: ?>
          <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Signin</a></li>
          <li><a href="#"><span class="glyphicon glyphicon-user"></span> Register</a></li>
          <?php endif;?>
        </ul>
     </div>
    

    之后 注销 按钮使用一次,用户 登录 再次单击浏览器的后退按钮加载 http://localhost/ciauth/index.php/Signin/signout 并激发signout()函数。

    我做错了什么?非常感谢。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Don't Panic    7 年前

    您需要将下面提到的行添加到 index & signin 方法。

    if ($this->session->userdata('is_logged_in')==TRUE)
        redirect('home');
    
        2
  •  0
  •   Kamarul Anuar    7 年前

    问题出现在这里:

    $current_user = $this->Usermodel->user_login($email, $password);
    
    if($current_user)
    {
      #is always !$current_user because $email and $password is empty. you should build condition with userdata first. if userdata not false or whatever condition comparing..and then, how you you pass output(return) in model $this->Usermodel->user_login($email, $password)??
    }
    else
    {
      #so it going here.
      redirect('signin');
    }
    

    用新建议更新。。

    public function signin() {  
       $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
       $this->form_validation->set_rules('password', 'Password', 'required');
       $this->form_validation->set_error_delimiters('<p class="error">', '</p>');
    
       if ($this->form_validation->run()) { // that's mean user come here after submit form..
          $email = $this->input->post('email');
          $password = $this->input->post('password');
          $this->load->model('Usermodel');
          $current_user = $this->Usermodel->user_login($email, $password);
    
          if ($current_user) { #maksure you function user_login() in Usermodel will not return FALSE if success login with $email and #password (must return something or TRUE). Then MUST return FALSE if failed to login.
             // re-set back the current user's data
             $this->session->set_userdata(
                array(
                   'user_id' => $current_user->id,
                   'user_email' => $current_user->email,
                   'user_first_name' => $current_user->fname,
                   'is_logged_in' => TRUE
                )
             );
             redirect('home'); 
    
          } else {
    
             $this->session->set_flashdata("signin_failure", "Incorrect email or password");
             redirect('signin'); 
    
          }
       } else { // user come here not after submit login form. possible click browsers button..
    
          $user_id = $this->session->userdata('is_logged_in');
          if($user_id){ // if return TRUE user already login..
             print_r('hello ' . $this->session->userdata('user_first_name') . ', youre already login.. do something below');
             #do something..
          } else {
             #you need to sign in with this form because you're not login.
             $this->load->view('signin');
          }
    
       }
    
    } // end of function..