$ _SESSION等于数据库中的值?

时间:2011-12-02 16:34:20

标签: php session-variables

当一个人登录我的网站时,我需要在数据库中检查其roleid的值,并依赖于我需要允许/拒绝访问页面。

我有这段代码,但它说$ _SESION变量'Access'未定义,我不明白为什么?

            $email = mysql_real_escape_string($_POST['email']);
            $password = md5(mysql_real_escape_string($_POST['password']));

            $checklogin = mysql_query("SELECT * FROM person WHERE email = '" . $email . "' AND password2 = '" . $password . "'");

            if (mysql_num_rows($checklogin) == 1) {
                $row = mysql_fetch_array($checklogin);
                $roleid = $row['roleid'];

                $_SESSION['Email'] = $email;
                $_SESSION['LoggedIn'] = 1;
                $_SESSION['Access'] = $roleid;

                echo "<h1>Success</h1>";
                echo "<p>We are now redirecting you to the member area.</p>";
                echo "<meta http-equiv='refresh' content='2;index.php' />";
            } 

            else {
                echo "<h1>Error</h1>";
                echo "<p>Sorry, your account could not be found. Please <a href=\"index.php\">click here to try again</a>.</p>";
            }
        } 

这是说明未定义的会话的if语句:

if (!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Email']) && $_SESSION['Access'] == '2')

修改 的 对不起,应该提到,session_start()在我的base.php文件中调用,该文件包含在此文件中。

修改

我不知道问题是什么,我可以将变量$ email分配给其他会话变量并显示,以便用户可以看到他们登录的是谁?

有人有什么建议吗?其他两个会话变量都可以正常工作。

4 个答案:

答案 0 :(得分:7)

根据您发布的代码,您遗漏了session_start()

如果这不在为您执行此操作的框架内,则必须在每个将在进行任何会话调用之前使用该会话的页面上调用它。

我认为错误发生在重定向之后,在您使用isset()empty()检查它的逻辑中。在执行任何会话逻辑之前,将session_start()添加到两个页面。

编辑

好的,你有session_start()。您可以print_r() $_SESSION并检查输出吗?

此外,您提及的运行会话启动的文件应包含在两个文件中,因为它是设置和检查会话中的值所必需的。

确保在运行任何empty()条件之前,您还要运行isset()。 Empty不会检查密钥是否存在。

再次编辑

$y的值是否可能不是作为单个值从数据库中出来的?那么你可以die(),只需打印$y的值来看看输出是什么吗?

答案 1 :(得分:0)

只需在if语句!empty($_SESSION['Access'])

中添加另一项检查
if (!empty($_SESSION['LoggedIn']) 
   && !empty($_SESSION['Email']) 
   && !empty($_SESSION['Access']) 
   && $_SESSION['Access'] == '2')

答案 2 :(得分:0)

检查$ row ['roleid']的拼写。数据库表中的字段名称是否与它完全相同?

更改

SELECT * FROM person WHERE

SELECT roleid FROM person WHERE

看它是不是......: - )

答案 3 :(得分:0)

这可能与您的问题无关,但我认为值得一提:您的用户名/密码SQL语句可能很危险。虽然你逃避输入变量,但通常更好的做法是这样做:

$checklogin = mysql_query("SELECT * FROM person WHERE email='".$email."'");
$row = mysql_fetch_array ($checklogin, MYSQL_ASSOC);

if (mysql_num_rows ($checklogin) == 1 && $row['password'] == $password)
{
 // you are logged in
}
else
{
 // wrong email or password
}

原因是你的当前语句只需要返回表中的任何一行,而这个语句需要返回表中的一个特定行。

相关问题