会话变量在php中为空

会话变量在php中为空,php,mysql,session-cookies,session-variables,session-state,Php,Mysql,Session Cookies,Session Variables,Session State,login.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

login.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页面会话变量没有打印出来。我不知道为什么,但这个问题不是每次登录时都会发生,有时会发生,所以我找不到问题所在。任何人都知道,请帮我解决这个问题。

从您的login.php中删除ob_start() 不要将会话_start()放在所有文件中

 e.g login.php, profile.php, etc
但是,将其添加到config.php中,例如:

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

检查这是profile.php的最顶端,在此脚本之前的任何输出都将使
标题无效。是否应该在
标题之后退出
?也用于密码而不是纯文本存储。根据脚本,如果会话变量不存在,则配置文件页面应重定向到登录页面。是重定向吗?是的!如果会话未设置,则为重定向警告:编写访问控制层并不容易,而且有很多机会使其严重出错。任何一款现代风格的手机都有内置的,你可以使用。至少绝对不要将密码存储为纯文本或弱散列(如SHA1或MD5)。是的,在删除ob_start()后,它可以正常工作。但是为什么ob_start会引起这样的问题呢?它不起作用,因为你需要使用它‎Ob_获取内容,Ob_结束刷新。在您的示例中,不需要输出缓冲区。但是,您可以在这里阅读更多关于它的信息