除非提交两次表单,否则简单的PHP登录系统不起作用

时间:2014-01-17 11:25:22

标签: php session

我在PHP中有一个非常简单的基于会话的登录系统。我过去经常使用类似的系统,从来没有任何问题。但是,现在我遇到了一个非常奇怪的事情 - 当我第一次输入我的用户名和密码时,没有任何反应。但是当我输入第二个,第三个和每个连续的时间时,它工作正常!

让我用两个文件来说明。在index.php中,我有一个标准的登录表单:

<form id="lform" action="login.php" method="post">
                <table cellpadding='1' cellspacing='0'>
                    <tr>
                        <td width='60'>
                            EMAIL<br/>(or Username)
                        </td>
                        <td width='120'>
                            <input type="text" name="email" id="l_email" class="keylog" />
                        </td>
                    </tr>
                    <tr>
                        <td>
                            PASSWORD
                        </td>
                        <td>
                            <input type="password" name="password" id="l_password" class="keylog" />
                        </td>
                    </tr>
                </table>
<!-- submit button, forgotten-password etc go here, not really relevant -->
            </form>

如您所见,它提交login.php。在该文件中,我首先检查数据库的用户名和密码。如果它检出(并且确实检查出来),则会发生这种情况:

//get the user's database entry in an array named $row

//create session variables
$_SESSION['username']=$row[username];
$_SESSION['user_id']=$row['id'];
$_SESSION['user_level']=$row['account_type'];

//store login in database
mysql_query("update members set last_login='$today' where id='$row[id]' ");
mysql_query("insert into login_log set member_id='$row[id]' ");

//redirect back to index.php
header("location: ".$url."en/index.php");
exit;

此时,一切似乎都很好。 MySQL查询正确执行,将登录保存到数据库中。如果我在这里var_dump($_SESSION)(而不是重定向),它会打印出会话数组,包括我在上面设置的所有变量。所以会话存在,它看起来像:

array(3) { ["username"]=> string(9) "monsignor" ["user_id"]=> string(1) "2" ["user_level"]=> string(1) "2" }

重定向后出现问题。在index.php的顶部,我放置了:

session_start();
var_dump($_SESSION);

此处(首次登录后)var_dump只显示array(0) { }!这就像会话由于某种原因在重定向期间被破坏了。

更奇怪的是,如果我现在再次输入我的用户名/密码并提交表单,重定向后它会在index.php中显示正确的会话值:

array(3) { ["username"]=> string(9) "monsignor" ["user_id"]=> string(1) "2" ["user_level"]=> string(1) "2" } 

从此时起,登录会话保持活动状态并正常工作。

因此,总而言之,在第一次登录尝试之后,会话变量似乎在登录脚本和重定向到的页面之间消失,但​​是在每次连续尝试时它都能正常工作!然后,如果我没有登录几个小时(我没有完全定时),第一次下一次尝试不再起作用,第二次尝试不行等。

我希望有人可以帮助我,因为我很难过。

编辑:

以下是login.php和index.php的完整代码,我将它放在pastebin上,因为它太大而无法在这里显示。

login.php index.php

编辑第2篇:

当我打开index.php,然后尝试第一次登录时,会出现上述问题。但是,当我打开index.php,重新加载页面一次,然后尝试第一次登录,它的工作原理。所以问题不在于重定向,而是与页面本身有关。

1 个答案:

答案 0 :(得分:2)

在设置$ _SESSION值

之前,尝试在login.php的顶部启动会话