【问题标题】:Set php session via ajax通过ajax设置php会话
【发布时间】:2012-01-31 10:25:47
【问题描述】:

我正在尝试构建我的 AJAX 登录系统,但我遇到了一些 PHP 会话问题。

这是我在index.php 中使用的 AJAX 代码:

$("#buttonLogin").click(function(){
    $.post("<?php echo $AJAX ?>/ajaxLogin.php",{
        Username : $("#loginUsername").val(),
        Password : $("#loginPassword").val()
    }, 
    function(result){
        if(result == "OK"){
            window.location.href = "<?php echo $PUBLIC?>/home.php";
        } else {
            $("#loginMessageError").show();
        }
    });
});

这是通过 AJAX 调用的 ajaxLogin.php

<?php
require_once("../settings.php");
require_once($ABS_ENGINE."/classUser.php");

$user = new User();
if($user->loginUser($_POST["Username"], $_POST["Password"])){
    $UserID = $user->getUserId($_POST["Username"]);
    session_start();
    $_SESSION['UserID'] = $UserID;
    echo "OK";
} else {
    echo "ERROR";
}
?>

当我在 home.php 并尝试回显 $_SESSION["UserID"] 时,我收到以下错误:

注意:未定义索引:第 23 行 C:\xampp\htdocs\webname\resources\templates\headerHome.php 中的用户 ID

这可能是不正确的,因为会话必须在任何输出之前设置,但如果我尝试回显$_SESSION['UserID'] = $UserID; 行,它的会话变量会正确显示。

【问题讨论】:

  • 唯一的其他解释是正在启动多个会话。检查两个页面的 session_id() 以验证这一点
  • 您确定您的 php.ini 设置为使用会话 cookie 并且路径是 PHP 可访问的吗?会话保存路径可能不适合您的设置。
  • @Paul 你能告诉我应该如何更改 php.ini 以允许会话吗?
  • @MaterMorbi php.net/manual/en/session.configuration.php 你去吧,根据你的需要设置它们,阅读文档,你会弄明白的。还要在会话部分阅读 php.ini 中的 cmets。
  • @MaterMorbi,你检查过这两个页面的 session_id()..

标签: php session


【解决方案1】:

您需要先启动会话,例如 session_start()。然后只有您可以访问会话变量。看看这个简单的例子,它可能会对你有所帮助:

aj.php

<script src="jquery.js"></script>
<script type="text/javascript">
$(document).ready( function(){
    $.ajax({
        type : 'GET',
        url : 'sess.php',
        data: {
            user : 'guna',

              },
        success : function(data){
                       alert(data);
        },
        error : function(XMLHttpRequest, textStatus, errorThrown) 
        {alert ("Error Occured");}
                 });


});
</script>
</html>

sess.php

<?php
session_start();
$_SESSION['user']=$_GET['user'];
echo $_SESSION['user'];
?>  

正如其他人指出的那样,更好的是,您还可以在读取会话变量的页面中检查 session_start()。

【讨论】:

    【解决方案2】:

    当我遇到这种问题时,解决它的方法是使用exit();

    <?php
    require_once("../settings.php");
    require_once($ABS_ENGINE."/classUser.php");
    
    $user = new User();
    if($user->loginUser($_POST["Username"], $_POST["Password"])){
        $UserID = $user->getUserId($_POST["Username"]);
        session_start();
        $_SESSION['UserID'] = $UserID;
        echo "OK";
        exit();
    } else {
        echo "ERROR";
    }
    ?>
    

    【讨论】:

    • 是的,这对我也有用,松散的。如果您将 Drupal 与非核心交付回调一起使用,请在您的交付回调中调用 drupal_session_commit();
    【解决方案3】:

    最好检查 session_start() 是否存在于 home.php 中。没有这个,您将无法读取会话数据。

    当您在执行echo $_SESSION['UserID'] = $UserID; 时,您将在同一行进行分配和访问,因此它显然可以工作。

    【讨论】:

    • session_start() 存在于 home.php 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2016-03-20
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多