在codeigniter中如何使用ajax登录后重定向

Posted

技术标签:

【中文标题】在codeigniter中如何使用ajax登录后重定向【英文标题】:In codeigniter How to redirect after login using ajax 【发布时间】:2017-09-19 11:08:21 【问题描述】:

我有一个登录弹出模式。我正在通过 ajax 登录

模态

<div class="modal-body">
              <form action="<?php echo base_url('Login');?>" method="POST">
                 <div class="form-group">
                    <input type="text" placeholder="Email or Mobile*" value="" id="loginEmail" name="email" class="form-control input-feild">

                 </div>
                 <div class="form-group">
                    <input type="password" placeholder="Password*" value="" id="loginPassword" name="password" class="form-control input-feild">

                 </div>
                 <div class="form-group">
                    <input type="button" id="l_submit" name="l_submit" value="Login" class="btn btn-primary input-feild">
                 </div>
               </form>
               <p id="error-msg"></p>
            </div>

我正在尝试使用 ajax 成功登录后重定向。如果电子邮件和密码正确,则重定向到任何页面。如果没有,那么它将显示错误。

控制器

function index() 

        $this->form_validation->set_rules('email', 'Email', 'trim|required');
        $this->form_validation->set_rules('password', 'Password', 'trim|required');

        if ($this->form_validation->run() == false) 
            echo validation_errors();

        else 
                $email      = $this->input->post("email");
                $password   = $this->input->post("password");
                $user = $this->Perfect_mdl->check_user($email, $password);
                if ($user) 

                    $logged_in_data = array();
                    foreach ($user as $logged_in_data) 
                        $logged_in_data = array(

                                    'id' => $user[0]->id,
                                    'email' => $user[0]->email
                                );
                    

                    $this->session->set_userdata($logged_in_data);
                    $id = $this->session->userdata('email');
                    $data['details'] = $this->Perfect_mdl->get_login_user_detail($id);

                    echo "Yes";

                else 

                    echo "No";
                
        
    

这是我的控制器,我在其中检查登录用户电子邮件和密码是否正确。

这是我的脚本

 <script type="text/javascript">  
        $("#l_submit").click(function()

            var email  = $("#loginEmail").val();
            var password   = $("#loginPassword").val();

            $.ajax(
                url : "<?php echo base_url('Login');?>", 
                type: 'POST',
                data : 'email':email,'password':password,
                success: function(msg) 

                        if (msg == "Yes")
                           window.location.href = "<?php echo current_url(); ?>";
                        else if (msg == "No")
                            $('#error-msg').html('<div class="alert alert-danger text-center">Incorrect Email & Password. Please try again ...</div>');
                        else
                            $('#error-msg').html('<div class="alert alert-danger">' + msg + '</div>');
                    
            );
            return false;
        );
</script>

正如您在成功部分看到的,当我输入正确的电子邮件/密码时。它显示是。但是我想重定向另一个页面,为什么在正确的电子邮件/密码上显示 YES。在不正确的电子邮件/密码上显示 NO

我哪里做错了???

【问题讨论】:

它显示YES 吗?它应该显示是?请调试您的代码。您是否检查了为什么if (msg == "Yes") 不起作用?您是否尝试提醒((msg == "Yes")) 进行一些调试 如果您使用的是ajax,为什么要提交表单?可能是您需要使用提交功能而不是点击 是的,我做到了,但是当(msg = "yes") 时,这并没有显示警告框 你应该把它放在 if 条件之上 是的,如果条件在上面放置警报框后,这会给我警报。 【参考方案1】:

您需要在 jQuery 和 Controller 函数中更改几行代码。在这里,我附上了您的代码的更新版本。请参考:

查看(引导模式)

<div class="modal-body">
          <form action="<?php echo base_url('Login');?>" method="POST">
             <div class="form-group">
                <input type="text" placeholder="Email or Mobile*" value="" id="loginEmail" name="email" class="form-control input-feild">

             </div>
             <div class="form-group">
                <input type="password" placeholder="Password*" value="" id="loginPassword" name="password" class="form-control input-feild">

             </div>
             <div class="form-group">
                <input type="button" id="l_submit" name="l_submit" value="Login" class="btn btn-primary input-feild">
             </div>
           </form>
           <p id="error-msg"></p>
        </div>

这是您的视图文件。它将保持不变。单击按钮时,您已经编写了需要修改的脚本。附加控制器功能后会触发:

控制器

function index() 
    if (!$this->input->is_ajax_request()) 
        echo 'No direct script is allowed';
        die;
    
    $this->form_validation->set_rules('email', 'Email', 'trim|required');
    $this->form_validation->set_rules('password', 'Password', 'trim|required');

    if ($this->form_validation->run() == false) 
        $result['status'] = 'error';
        $result['message'] = validation_errors();
    else 
        $email      = $this->input->post("email");
        $password   = $this->input->post("password");
        $user = $this->Perfect_mdl->check_user($email, $password);
        if ($user) 
            $logged_in_data = array();
            foreach ($user as $logged_in_data) 
                $logged_in_data = array(
                    'id' => $user[0]->id,
                    'email' => $user[0]->email
                );
            
            $this->session->set_userdata($logged_in_data);
            $id = $this->session->userdata('email');
            $data['details'] = $this->Perfect_mdl->get_login_user_detail($id);
            $result['status'] = 'success';
            $result['message'] = 'Yeah! You have successfully logged in.';
$result['redirect_url'] = base_url();
        else 
            $result['status'] = 'error';
            $result['message'] = 'Whoops! Incorrect Email & Password. Please try again';
        
    
    $this->output->set_content_type('application/json');
    $this->output->set_output(json_encode($result));
    $string = $this->output->get_output();
    echo $string;
    exit();

脚本

<script type="text/javascript">
$("#l_submit").click(function()

    var email  = $("#loginEmail").val();
    var password   = $("#loginPassword").val();

    $.ajax(
        url : "<?php echo base_url('Login');?>",
        type: 'POST',
        data : 'email':email,'password':password,
        success: function(resp) 

            if (resp.status == "success")
                window.location.href = resp.redirect_url;
            else
                $('#error-msg').html('<div class="alert alert-danger">' + resp.message + '</div>');
        
    );
    return false;
);

这是正确的答案。如果您遇到任何问题,请告诉我。

【讨论】:

这对我不起作用,在错误消息中登录失败后显示未定义 @vishalkumar 尝试使用 consol.log(resp); 进行调试,如果条件如下:success: function(resp) consol.log(resp); if (resp.status == "success") window.location.href = resp.redirect_url; else $('#error-msg').html('&lt;div class="alert alert-danger"&gt;' + resp.message + '&lt;/div&gt;'); 是的,但我没有显示任何类型的错误或警报。我没有收到任何类型验证错误, @vishalkumar 你检查你的控制台了吗?如果响应有任何问题,它将显示错误。 (我正在考虑你正在使用萤火虫) 是的,我做了仍然没有显示验证错误消息。添加console.log($resp) 后,我在firebug 中得到了这个Object type: "error", message: "Incorrect Email/Password .....!" 但是为什么这没有显示任何验证错误。【参考方案2】:

如果您想从脚本跳转到另一个控制器/方法,您可以在代码中使用简单的redirect()(来自 url 帮助程序)。但是,这不会提醒用户登录成功:它只是一个普通的重定向。

正确的方法是返回一个 json 文件,所以不要回显是或否,而是使用这个:

$response['type'] = 'error';
$response['msg'] = 'Login Succesful';
$response['redirect'] = 'http://your-url.com/controller/method';
echo json_encode($response);
die;

然后,您在 ajax 调用中处理答案,以及一些好的警报(在我的例子中,Sweet Alert)有点像这样:

success: function(data) 
    if (data.redirect) 
        swal(
            title: '¡Success!',
            text: data.msg,
            timer: 2000,
            type: data.type,
            showConfirmButton: false
        , function() 
            window.location.href = data.redirect;
        );
     else 
        swal('¡Error!', data.msg, data.type);
    

所以这段代码的作用是,如果你的 json 响应有一个重定向字段,会在一段时间后触发重定向。但是如果您的 json 响应没有字段重定向,则只会显示警报。

【讨论】:

【参考方案3】:

检查您的返回数据类型。可能您可以在 Ajax 代码中的数据类型中使用。返回数据无法读取 if 条件。我面临同样的问题或使用这个

if($.trim(msg) == '是')

【讨论】:

【参考方案4】:

echo "Yes"; 更改为die("Yes");。这将确保在“是”或“否”之后不会发送任何内容,然后 JS 代码将按预期工作。

【讨论】:

【参考方案5】:

它们也是成功后从控制器重定向的一种方式。 在这种情况下,您只需要按照这两个步骤进行重定向 控制器中的这一行,您可以在其中获得真实条件并希望重定向

if($result)     
      echo base_url()."welcome/";  
      
    else  
       echo 0;  
      

在您应用 ajax 的 html 页面上,在真实情况下您尝试此重定向页面

success: function(result)  
            if(result!=0)  
                // On success redirect.  
            window.location.replace(result);  
              
            else  
                alert('wrong'); 
        

【讨论】:

以上是关于在codeigniter中如何使用ajax登录后重定向的主要内容,如果未能解决你的问题,请参考以下文章

如果会话超时,如何在 MVC 中的 jquery ajax 调用后重定向到新页面?

Laravel Ajax登录,成功后重定向到上一个url

django,身份验证后重定向到ajax操作

登录 AJAX 和 codeigniter

在 CodeIgniter 4 中提交表单后重定向页面无法工作

SESSION 变量在 Codeigniter php 中的 redirect() 上被重置