我正在尝试构建AJAX登录系统,但PHP会话存在一些问题。
这是我在我使用的AJAX代码index.php:
$("#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();
}
});
});
Run Code Online (Sandbox Code Playgroud)
这就是ajaxLogin.php通过AJAX调用的:
<?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";
}
?>
Run Code Online (Sandbox Code Playgroud)
当我进入home.php并尝试echo时$_SESSION["UserID"],出现以下错误:
注意:未定义的索引:第23行的C:\ xampp \ htdocs \ webname \ resources \ templates \ headerHome.php中的UserID
这可能是不正确的,因为必须在任何输出之前设置会话,但是如果我尝试回显$_SESSION['UserID'] = $UserID;行,则它的会话变量会正确显示。
您需要先启动会话,例如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>
Run Code Online (Sandbox Code Playgroud)
sess.php
<?php
session_start();
$_SESSION['user']=$_GET['user'];
echo $_SESSION['user'];
?>
Run Code Online (Sandbox Code Playgroud)
正如其他人指出的那样,更好的是,您还可以在读取会话变量的页面中检查session_start()。
当我遇到这种问题时,解决它的方法是使用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";
}
?>
Run Code Online (Sandbox Code Playgroud)