PHP 登录后无法保存 $_SESSION 变量

3

第一次来这里,希望一切顺利!

我是PHP新手,正在尝试创建一个网站,让用户拥有自己的页面可以编辑内容。我已经成功实现了登录系统的一半功能。它正确识别用户名和密码,但似乎没有存储$_SESSION变量。起初我以为是因为我试图将用户名(本身就是一个变量)作为$_SESSION变量,但即使我将其设置为绝对值,我的代码检查用户是否已登录的功能仍会重定向到“您未登录”的页面。以下是我的验证php代码:

<?php

$host="xxxx.ipagemysql.com";
$username="xxxxx";
$password="xxxxxx";
$db_name="farmers";
$tbl_name="users";

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$farmeruser=$_POST['farmeruser'];
$farmerpw=$_POST['farmerpw'];

$sql="SELECT * FROM ".$tbl_name." WHERE farmeruser='".$farmeruser."' and farmerpw='".$farmerpw."';";

$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count==1){

session_start();
$_SESSION['member'] = "affirmative";
header("location:succesful_login.php");
}
else {
echo "Wrong Username or Password";
}
?>

这里有一个页面,它无法识别用户是否已登录:

<?php
session_start();
if($_SESSION['member'] == "affirmative")
{
echo
"Welcome!";
}
else {
header('Location: http://www.leukosweb.com/user_not_recognized.php');
}
?>

有什么想法为什么这不起作用?

附注:我想将“肯定”的内容更改为用户的登录名。如果您想帮助我在登录验证页面中使用变量设置$ _SESSION 'member'变量,那也太棒了!


2
请勿在新代码中使用mysql_*函数。它们已不再维护,并且已经开始弃用过程,请参见红框。相反,学习使用预处理语句,并使用PDOMySQLi这篇文章将帮助您决定使用哪个。如果您选择PDO,则这是一个好的教程 - Geek Num 88
此外,在发出“Location”头之后,始终立即使用exit;退出。 - Phil
谢谢你们两个的建议。我没有意识到我正在使用过时的函数。那是我使用过的第二个。之前在论坛上寻找答案时,我发现我使用了另一个过时的函数。 - Eric Sparks ii
我正在使用ipage.com的php和mysql安装。这是他们的设置: - Eric Sparks ii
平台类型 Debian MySQL 版本 MySQL 版本 4.1.22 Perl 版本 Perl 5.8.8 PHP 版本 - Eric Sparks ii
显示剩余2条评论
5个回答

1

session_start()需要向用户的浏览器添加一个cookie,如果在第一个<?php之前有任何空格,这些空格将被输出到浏览器并会破坏设置cookie的过程。我建议将session_start()移到第二行。

<?php
session_start();

请确保没有额外的空格,您可以检查浏览器的cookie,看看是否有一个名为PHP_SESSION或类似的cookie,如果有

print session_start();

如果会话能够被创建,它应该返回true - 如果不能创建,则可能存在PHP配置和创建会话的问题。

此外,这需要进行更正。

header("location:succesful_login.php");

应该是

header("Location: succesful_login.php");


谢谢你的建议。@shinkou 打印会话在屏幕上显示了“1”,所以我猜它正在创建会话。我不确定你所说的将session_start()移动到第二行是什么意思 - 它不是已经在那里了吗? - Eric Sparks ii
哦,我明白你是指验证页面。 - Eric Sparks ii

1

前往Ipage并登录您的账户。
进入CGI和脚本语言支持。
选择PHP脚本。
在那里通过按下ctrl + f找到save_path来编辑php.ini文件,并更改
`session.save_path = "/var/php_sessions"`

`session.save_path = "/tmp"`。


谢谢!这一定是答案。 - Harsha

1

在php.ini文件中检查会话超时时间


谢谢!虽然不是答案,但它让我朝着正确的方向前进了。问题出在ipage的php.ini文件上。他们默认的保存路径并不存在,除非你自己创建它!你必须创建那个确切的路径和位置,或者更改ini文件为你自己的路径 =) - Eric Sparks ii

0

你需要尝试一些事情来确定出了什么问题。让我们尝试查看以下几行代码。

session_start();
$_SESSION['member'] = "affirmative";
header("location:succesful_login.php");

将头部位置重定向注释掉。 在 $_SESSION['member'] 被设置为 affirmative 后,输出该变量以查看其中的内容。

echo "DBUG: ".$_SESSION['member']. "<br />";

让我们先测试一下,确保它能正常工作,然后您可以使用您要求的用户名进行设置。

$_SESSION['member'] = $farmeruser;

但是那个 $farmeruser 直接来自于 $_GET... 你可能想要在防止 SQL 注入之后从行中获取用户名。

让我们先检查一下设置代码后面的代码,看看它是否工作。我也喜欢把 session_start() 放在页面顶部。将连接数据库的详细信息放在单独的 include 文件中。


是的,我原本打算在让它正常工作后添加一些安全功能,现在我已经做到了。结果发现这是iPage的默认ini保存会话设置问题。 - Eric Sparks ii

0

好的,虽然Anad Pal的回答不是正确的,但它让我朝着正确的方向前进了。事实证明,您必须更改iPage帐户的php.ini文件中的以下行

session.save_path = "/var/php_sessions"

session.save_path = "/tmp"

现在一切都正常工作。谢谢!讽刺的是那并不是我的代码问题,而是ipage默认的会话存储机制不起作用 >.<


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