为什么基于会话的登录系统不起作用?

时间:2011-05-14 05:05:03

标签: php session

我刚刚开始学习PHP,我为我的网站编写了一个PHP和mySQL帐户系统。我知道sql的工作正常,问题是我的PHP会话。

当我去测试它时,我可以尝试登录,但它失败了。然后,我尝试再次登录,它将成功。它总是在第二次尝试登录时成功。它在Firefox的第一次尝试中从未成功,但它确实在Chrome中实现。此外,在我成功登录后,Chrome中的几次,在我的网站上访问一些不同的页面似乎会删除会话。或者,至少,该会话没有在其他页面上注册。我在Firefox上没有这个问题。我已经检查,双重检查和三重检查,并且我的所有页面都先调用session_start(),所以我知道这不是问题。

我不能对PHP会话有足够的理解,因为它不能始终如一地工作。

发布后,我在IE中测试过,一切正常。我登录第一次尝试,我访问的任何页面都会保持我的会话。

以下是实际“登录”用户的php脚本的代码:

<?php
session_start();
//pass info to mysql(servername, username, password)
$connect = mysql_connect ("localhost", "ggstudio", "mtgertai1");
if (!$connect) 
{
    die ('Failed to connect: ' . mysql_error());
}
mysql_select_db("ggstudio_accountDatabase", $connect);

//capture data sent to page through login
//usernameField and passwordField

$usernameSubmission = $_POST[usernameField];
$passwordSubmission = $_POST[passwordField];

$validAccount = mysql_query("SELECT * FROM userAccounts WHERE userID = '$usernameSubmission' AND userPassword = '$passwordSubmission'");
$row = mysql_fetch_array($validAccount);
if (($row['userID'] == $usernameSubmission)&&($row['userPassword'] == $passwordSubmission))
{
/*********************************
**********************************
assign global variables to session
after starting session and then***
redirect to user homepage*********
**********************************
**********************************
*/
//get account number from database
$_SESSION['accountNumber']= $row['accountNumber'];
//get first name from database
$_SESSION['firstName']= $row['firstName'];
//get last name from database
$_SESSION['lastName']= $row['lastName'];
//save username into session
$_SESSION['username']= $row['userID'];
//save password into session (only really useful if user wants to change password)
$_SESSION['userPassword']= $row['userPassword'];
//get user's email address from database
$_SESSION['userEmail']= $row['userEmail'];
//get GP from database
$_SESSION['gpoints']= $row['userGloryPoints'];
//get user join date from database
$_SESSION['userJoinDate']= $row['userJoinDate'];
//get user rank
$_SESSION['userRank']= $row['userRank'];

header('Location: http://www.glorygamer.com/account_home.php');
}
else
{
    $loginFailed= TRUE;
    setcookie("incorrectLogin", $loginFailed, time()+20);
    header('Location: http://www.glorygamer.com/shibboleth.php');
}
?>

2 个答案:

答案 0 :(得分:2)

如果会话间歇性地工作,那么我会说发生了两件事之一:

  • 您的会话未在浏览器中正确设置
  • 您的会话未及时保存在服务器上。

可能发生的一件事(特别是当您在localhost上进行测试时)是经过身份验证的会话未及时写入磁盘以进行下一次请求,因此下一个请求似乎未经过身份验证(请记住,apache是多进程;您的第二个请求可以由另一个进程处理,该进程不知道第一个进程在做什么。这是一个可能的解决方案:

$_SESSION['userRank']= $row['userRank'];
session_write_close();
header('Location: http://www.glorygamer.com/account_home.php');

session_write_close()的调用应该意味着您的经过身份验证的会话已准备就绪,可以用于下一次请求。

HTH。

答案 1 :(得分:1)

我看到的第一件事是缺少单引号。此外,你绝对应该逃避这些,以便没有人可以对你进行任何SQL注入。

$usernameSubmission = $_POST[usernameField];
$passwordSubmission = $_POST[passwordField];

应该是:

$usernameSubmission = mysql_real_escape_string($_POST['usernameField']);
$passwordSubmission = mysql_real_escape_string($_POST['passwordField']);