【问题标题】:Session variable was empty in php会话变量在php中为空
【发布时间】:2020-09-21 17:52:53
【问题描述】:

登录.php

    <?php
    ob_start();
    session_start();
    include '../config.php';
    if( (isset($_SESSION['can-id']) )) {
    header('location: ../home/profile.php');
    }
    if(isset($_POST['can-login']))
    {
        $email=$_POST['email'];
        $password=$_POST['password'];
    $sql="SELECT * FROM `user_credentials` WHERE `email`=:email AND `password`=:password";
    $pdoResult=$conn->prepare($sql);
    $pdoExec=$pdoResult->execute(array(":email"=>$email,":password"=>$password));
    $pdoResult->setFetchMode(PDO::FETCH_ASSOC);
    $count=0;
    $uid='';
    while ($r=$pdoResult->fetch()) {
      # code...
    $count+=1;
    $uid=$r['email'];
    }

    if ($count==1) {
      # code...
      $_SESSION['can-id']=$uid;
      header('location: ../home/profile.php');

    }
    else
    {
      $_SESSION['error']="login failed";
    }
    }
    ?>

<html>
....
</html>

profile.php

<?php
    ob_start();
    session_start();
    if (!(isset($_SESSION['can-id']))) {
        # code...
        header('location: ../login/');

    }
    else
    {
        $cid=$_SESSION['can-id'];
    }
?>
<h1 ><?php echo $cid;?></h1>

这是我登录页面后的代码,页面被重定向到 profile.php 页面,但在配置文件页面会话变量没有打印我不知道为什么,但每次登录时都不会出现这个问题它有时会发生我找不到问题所在。有谁知道请帮我解决问题。

【问题讨论】:

  • 检查这是profile.php的最顶部,在这个脚本之前的任何输出都会使header无效。 exit 应该在header 之后?也使用password_hash 来存储密码而不是纯文本存储。
  • 根据您的脚本,如果会话变量不存在,您的个人资料页面应该重定向到登录页面。是重定向吗?
  • 是的!如果会话未设置,则会重定向
  • 警告:编写访问控制层并不容易,而且有很多机会严重错误。任何现代的development frameworkLaravel 都带有一个内置的authentication system,并且有authentication libraries 可以使用。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本 或像 SHA1 或 MD5 这样的弱哈希。

标签: php mysql session-cookies session-variables session-state


【解决方案1】:

从你的 login.php 中删除 ob_start() 不要将 session_start() 放在所有文件中

 e.g login.php, profile.php, etc

但是,例如,将其添加到您的 config.php 中:

<?php 
 session_start(); 
 //.. config variables here

然后,将 config.php 也包含在您的 profile.php 中。

【讨论】:

  • 是的,删除 ob_start() 后它工作正常。但是为什么ob_start会导致这样的问题。
  • 它不起作用,因为您需要使用 ‎Ob_get_contents、Ob_end_flush。在您的示例中,不需要输出缓冲区。但是,您可以在此处阅读更多相关信息 php.net/manual/en/function.ob-start.php#93633
猜你喜欢
  • 2014-03-24
  • 2018-01-24
  • 2011-09-03
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多