【发布时间】:2015-09-09 21:47:32
【问题描述】:
我正在制作一个需要用户登录的网站(在本地开发);我使用php-login.net framework 作为我的起点,让我的代码与 MySQL 对话并创建会话就好了。
关于 php 会话和 ajax,我几乎每一个 SO question 都经历过;但我仍然无法让我的代码按我想要的方式工作。
现在,我正在使用 ajax 在用户成功登录后调用其他一些 php 脚本,但是它不能正常工作。在 Firefox 中,清除了所有 cookie、历史记录等,看起来会话变量没有通过 ajax 调用维护。但是,如果我 log-out 然后重新登录,会话变量似乎可以通过 ajax 正确传递。
例如:
在我的 logged_in.php 脚本中,我使用 ajax 调用另一个脚本:view_samples.php。
logged_in.php
<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
// debug some variables
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
// if logged in
if ($_SESSION['logged'] == 1) {
?>
<button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
<div id="ajaxResult"></div> <!-- results of ajax calls go here -->
<?php
}
?>
loggedInButtons.js
$(document).ready(function(){
$("#view_samples").click(function(){
$.ajax({
url: "view_samples.php",
cache: false,
success: function(result){
$("#ajaxResult").html(result);
}
});
});
}
view_samples.php
<?php
session_start():
// debug session
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
if ($_SESSION['logged'] == 1) {
// do something because we are properly logged in
} else {
echo "not logged in!";
}
?>
当我使用以前未登录的浏览器登录时,我看到它设置了一个会话 ID X;但是,当按下按钮并进行 ajax 调用时,我会看到一个新的会话 ID Y。然后我注销并重新登录,看到我的会话 ID 是 Y(在 ajax 之前),当我单击按钮时我的会话 ID 是 Y(在 ajax 之后)。
我还注意到,如果我在不按查看示例按钮的情况下继续登录和注销,每次都会生成一个新的会话 ID。但是,只要我按下按钮,就会创建一个全新的会话 ID,如果我注销然后重新登录,它似乎总是设置的那个。
我错过了什么?确保在整个 ajax 调用期间维护创建的第一个会话的正确方法是什么?我应该将会话 ID 发布到被调用的脚本吗?
【问题讨论】:
-
你需要 session_start(): 在两个 php 文件中,如果没有 $_SESSION 将为空,ajax 将始终保持你的 cookie 一直进出。
标签: javascript php ajax session login