【问题标题】:Is this a session issue?这是会话问题吗?
【发布时间】:2016-03-29 00:15:49
【问题描述】:

我的这段代码在开发机器上运行良好,但是当移植到生产环境时,尽管是正确的,但用户会收到警报错误的详细信息。

我猜这是 PHP 的会话问题。但是,我看到会话文件保存到服务器上的 /tmp。关于导致此问题的原因,我是否遗漏了一些明显的东西?

代码参考如下。

session_start();
include_once 'dbconnect.php';

if(isset($_SESSION['user'])!="")
    {
        header("Location: home.php");
    }
if(isset($_POST['btn-login']))
    {
        $email = mysql_real_escape_string($_POST['email']);
        $upass = mysql_real_escape_string($_POST['pass']);
        $res=mysql_query("SELECT * FROM `USERS` WHERE `EMAIL` = '$email'");
        $row=mysql_fetch_array($res);
        if($row['PASSWORD']==md5($upass))
            {
                $_SESSION['user'] = $row['ID'];
                header("Location: home.php");
            }
        else
            {
                ?>
                <script>alert('wrong details');</script>
                <?php
            }

    }

【问题讨论】:

  • 检查电子邮件和密码的代码不使用会话变量。为什么会是会话问题?
  • 这是无效的语法 if(isset($_SESSION['user'])!="") - 你需要 2 个条件。检查它是否已设置,如果不等于。
  • 为什么我觉得我在过去一天左右多次看到相同的问题/代码?编辑:stackoverflow.com/q/32094350 我是这么认为的,在其他几个人中。
  • 有人发布了一个语法错误的教程,今天所有这些人都看过了,我发现 @Fred-ii- 今天一定已经 5 岁了

标签: php linux apache session


【解决方案1】:

所以我终于修好了。从 Windows 到 Linux MySQL 表名区分大小写。不知道。

【讨论】:

  • 是的,* NIX 和 Windows 完全是两种不同的动物,无处不在。还要记住文件夹/文件名命名约定;-)
【解决方案2】:

改变

if (isset($_SESSION['user']) != "") {
    header("Location: home.php");
}

if (!empty($_SESSION['user'])) {
    header("Location: home.php");
}

有关更多信息,请查看 karim79 的这篇帖子 https://stackoverflow.com/a/1519849/1592783。或者,如果您想了解empty,请查看http://php.net/empty

【讨论】:

  • 很多人喜欢它的解释。这样,每个人都可以学习。你知道发生了什么,我也知道,其他人都知道,但许多不熟悉条件语句和 PHP 的人不会。 深思你未来的答案。提示:它吸引了更多的选票(+)。 ;-)
【解决方案3】:

isset 只会返回真或假。

if(isset($_SESSION['user'])!="")

试着改成

if(isset($_SESSION['user']))

或者将 $_SESSION['user'] 的值与:

if($_SESSION['user'] == "")

【讨论】:

    【解决方案4】:

    试试这个。我做了以下更改:

    • 修复$_SESSION['user']isset() 测试。您不应该将其与"" 进行比较。也许你真正想要的是if(!empty($_SESSION['user'])

    • 使用elseif,这样它只在没有设置会话变量时检查电子邮件和密码。

    session_start();
    include_once 'dbconnect.php';
    
    if(isset($_SESSION['user']))
        {
            header("Location: home.php");
        }
    elseif(isset($_POST['btn-login']))
        {
            $email = mysql_real_escape_string($_POST['email']);
            $upass = mysql_real_escape_string($_POST['pass']);
            $res=mysql_query("SELECT * FROM `USERS` WHERE `EMAIL` = '$email'");
            $row=mysql_fetch_array($res);
            if($row['PASSWORD']==md5($upass))
                {
                    $_SESSION['user'] = $row['ID'];
                    header("Location: home.php");
                }
            else
                {
                    ?>
                    <script>alert('wrong details');</script>
                    <?php
                }
    
        }
    

    【讨论】:

    • 还是同样的问题。不完全确定为什么它会因为 md5 检查失败而起作用。
    • 不要在密码上使用mysql_real_escape_string,因为您没有将其替换为查询。
    • var_dump($row['PASSWORD'], md5($upass)); 放入else 子句中,这样您就可以看到密码是什么了。
    • 更好的是,根本不要使用 MD5,而是更多“本世纪”的东西。
    • 我很惊讶你没有提到他们使用 MD5。如果我把答案放进去而不提,并用它代替一个安全的散列函数,人们会喜欢我的。编辑:更不用说他们使用mysql_
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2011-07-18
    • 2011-03-08
    • 2013-10-21
    • 2012-10-19
    相关资源
    最近更新 更多