PHP会话在页面之间丢失数据

5

我正在尝试为我的网站设置一个登录系统,需要用户登录才能发布内容。我已经使用会话(session)进行了设置,在本地主机上运行得很好,但在服务器上却不能正常工作。我在一些页面上设置了print_r(session)来查看数据丢失的位置。在checklogin.php页面上,也就是当有人登录时运行的页面,它可以正常工作。以下是其中的一些代码:

<?php
session_name('login_session');
session_start();

mysql_connect("localhost","root","root") or die(mysql_error());
mysql_select_db("date_ideas") or die(mysql_error());

$uname=$_POST['uname'];
$uname=mysql_real_escape_string($uname);
$pass=$_POST['pass'];
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);

$query="SELECT * FROM users WHERE uname='$uname' AND pass='$pass'";

$result=mysql_query($query) or die(mysql_error());

$numrows=mysql_num_rows($result);

echo $numrows;

if ($numrows==1)
{
$_SESSION['login']="1";
$_SESSION['uname']=$uname;
echo "<script type='text/javascript'>alert('match');</script>";
print_r($_SESSION);
}
else
{
$_SESSION['login']="";
echo "<script type='text/javascript'>alert('Invalid Login');</script>";
echo "<script type='text/javascript'>window.location = 'login.php?uname=$uname'</script>";
}
?>

当我提交正确的登录信息时,警告框弹出并且打印返回:

数组([login] => 1 [uname] => FrizbeeFanatic14)

所以在这个点上它是有效的。然而,当我转到主页面时,打印变成了:

数组()

因此它已经丢失了会话信息。以下是主页面的代码:

<?php
session_name('login_session');
session_start();
?>
<html>
<head>
<title>Great Date Ideas</title>
<link rel="stylesheet" type="text/css" href="mainstyle.css" />
<script type="text/javascript" src="validate.js"></script>
<script type="text/javascript" src="cookiecheck.js"></script>
</head>
<body onload="checkCookie()">
<script type="text/javascript">
if (detect=false)
{
document.write("You must enable cookies to view this page.");
window.stop();
document.execCommand('Stop');
}
</script>
<div id="home"><?php require("header.php");?></div>
<?php
print_r($_SESSION);
mysql_connect("localhost","root","root") or die(mysql_error());
mysql_select_db("date_ideas") or die(mysql_error());

$result=mysql_query("SELECT * FROM ideas ORDER BY post_date DESC") or die(mysql_error());

虽然接下来的内容比较长,但是它能够正常工作。

所以所有这些代码在我的本地主机上都可以正常运行,但是在服务器上我会遇到这个错误。


你需要在 if (detect=false) 中使用两个等号而不是一个。 - emco
2个回答

4
我曾经遇到过类似的问题,当我在访问另一个页面时,不小心更改了域名(从 www.mydomain.commydomain.com 以及反之)。
你可以使用 session_set_cookie_params() 来使你的会话在不同的子域之间保持持久性。
session_name('login_session');
session_set_cookie_params(0, '/', '.mydomain.com');
session_start();

编辑:也许这篇文章可以帮到你:一篇非常有趣的文章:PHP 会话调试


@jeroen 是的,它是.seanhess.net,而.ryan.seanhess.net也不起作用。无论如何,谢谢,看起来可能是服务器设置的问题,我会查看的。 - FrizbeeFanatic14
@FrizbeeFanatic14 或许这篇文章可以帮到你:http://shiflett.org/blog/2011/mar/php-session-debugging - jeroen
我找到了问题所在 - PHP会话的保存目录是一个根Apache目录,而我正在运行nginx fastcgi。我只需更改文件夹的根权限即可解决问题。非常感谢您的所有帮助。 - FrizbeeFanatic14
1
你说的是一篇非常有趣的文章?它链接到http://PHP%20Session%20Debugging。 - NobleUplift
1
@NobleUplift 非常奇怪,我很确定当时我放了一个有效的链接。但我想我想要链接到我现在链接的那篇文章... - jeroen
显示剩余6条评论

1
我发现了问题 - PHP会话的保存目录是一个根Apache目录,而我正在运行nginx fastcgi。我只需更改文件夹的根权限即可解决问题。非常感谢你的帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接