1

我正在使用 AJAX 登录系统,但不确定如何将 PHP 会话变量从 AJAX 返回到登录页面。我的问题是,如果可能的话,我如何将 php 变量返回到登录页面。下面是我创建的示例。

登录页面

<?php

session_start();

?>

<form>

    <input type="text" id="username" />

    <input type="text" id="password"/>

    <input type="button" id="submit" />

</form>

<script type="text/javascript" >

    $('#submit').click(function() {

var username = $('#username').val();

var password = $('#password').val();

    $.post('ajax_file.php', 
    {
    username: username,
    password:password,
    }, 
    function (data) {

    /* what do I do here that will return the php variable 
    $_SESSION['user_id'] and let the user be logged in when
    they go to homepage.php*/
    setTimeout('window.location.href="homepage.php"', 2000);
    });});

</script>

这是ajax页面。我知道会话变量突然弹出的逻辑没有意义,让我们假设它是在页面的前面创建的。

$username = $_POST['username'];

$password = $_POST['password'];

if(login($username, $password)) {

    return $session_user_id = $_SESSION['user_id']; 

}
4

5 回答 5

2

您可以只做 AJAX 帖子,将会话变量设置为接收帖子的页面中的会话,它将存储在会话中(它是同一个会话)。在 AJAX 回调中将用户转发到主页。

当然,您必须考虑登录凭据不正确的情况。

于 2012-09-04T05:50:34.297 回答
1

诀窍是你的 JavaScript 甚至根本不需要知道会话。您可以通过相应的 ini 设置将 PHP 配置为使用HttpOnlycookie 进行会话管理。

我会像这样实现 AJAX 脚本:

session_start(); // start the session

if (login($username, $password)) {
    // alter session to hold user id
    $_SESSION'user_id'] = $user_id_from_database_or_something;
    return true;
} else {
    return false;
}

AJAX 完成处理程序查看返回值并重定向到主页(如果是)true。类似下面的东西(我假设 PHPreturn被翻译成类似的东西echo json_encode($return_value)

if (data) {
    // do redirect
} else {
    // login failed
}

然后,当用户访问主页时,他们的浏览器会发送一个会话 cookie,以便您确定他们是否已登录。

于 2012-09-04T06:20:49.653 回答
0

改进答案

对于 Jquery,使用下面的函数

function sendAjax(showAllExist, controller) 
{

   $.ajax({
   type: "post",
   url: login.php,
   data: yourformdatacomeshere,
   beforeSend:  function() {
         //do whatever you want to do before request
    },

    error: function() {
        //display in case of error
    },

    success:  function(data) {       
       //display in case of error
    if(data!=""){
        //redirect use to home pahe
        window.location.href ='homepage.php';
    }else{
        //display login is not correct
    }

    },

    complete:  function() {
        //hide any event which you have started on beforeSend 
    }

 });     
    return true;    
}
于 2012-09-04T05:59:05.950 回答
0

你不能这样做:

     $.post('ajax_file.php', 
    {
    username: username,
    password:password,
    loginSession: <?php echo  $_SESSION['user_id']; ?>
    }, 
    function (data) {
    //Check here if login is correct.
    if correct, create this variable:
   var logged= "?logged="+data.SessionID;
    /* what do I do here that will return the php variable 
    $_SESSION['user_id'] and let the user be logged in when
    they go to homepage.php*/
    setTimeout('window.location.href="homepage.php"+logged+"'", 2000);
    });})

当数据返回时,返回带有 sessionID 的 homepage.php。

在 php 脚本上执行以下操作:

if(isset($_GET['logged'])){
  start_session();
  $_Session['LOGGED']='true';
}
于 2012-09-04T06:15:06.530 回答
0

使用这种在shail答案之上即兴创作的方法。

你的ajax文件代码

$username = $_POST['username'];

$password = $_POST['password'];

if(login($username, $password)) {
  $session_user_id = $_SESSION['user_id'];// this is from your code
  $responseArray = array("message"=>"success","sessionId"=>$session_user_id);
}
else
{
  $session_user_id = "";
  $responseArray = array("message"=>"error","sessionId"=>$session_user_id);
}
echo json_encode ( $responseArray );
die ();

然后在 ajax 函数中进行以下更改。

 var frmdata = jQuery("#logindata").serialize(); // which contains the data of username and password
 jQuery.ajax({
     type : "POST"
    ,url :'ajax_file.php'
    ,data :frmdata
    ,dataType: "json"
    ,success : function(data){               

        if(data.message == "success")
            {
                //redirect it to your desire page
            }
            else
            {
                //redirect it to your login page
            }

       }
 ,beforeSend: function(html){
        // some loader goes here while ajax is processing.
       }
}); 

希望这有助于随时为这个答案提出任何问题。

于 2012-09-04T07:12:01.597 回答