会话缓存限制器错误


Session cache limiter error

我正在我正在做的新演示网站上测试我的登录。我实际上可以登录,并且我的用户名从数据库中返回,但是在顶部出现以下错误:

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /Applications/MAMP/htdocs/websiteNew/testlogin.php:1) in /Applications/MAMP/htdocs/websiteNew/resources/auth/session.php on line 3

为什么我会收到该错误?我知道如果我在调用会话之前调用包含文件,可能会导致错误。但我看不出我在这里这样做?

注意:更新的代码:

标题.html

   <?php
            $error='';
            if( !isset( $_SESSION ) ) session_start();
            if( !isset( $_SESSION['username'])) include('resources/auth/login.php'); 
            else exit( header('Location: testlogin.php') ); 
    ?>
  <html>
    <body>
       <!-- Navigation code -->

索引.php

<?php include 'resources/includes/header.html' ?>
      // Content Code
    </body>
  </html>

登录.php

<?php
    /* login.php */
    if( !isset( $_SESSION ) ) session_start();
    include 'resources/dbconnect/dbconfig.inc.php';
    $error = '';
    if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_POST['submit'] ) ) {

        if( empty( $_POST['username'] ) || empty( $_POST['password'] ) ){
            $error = 'Both fields are required.';
        } else {
            $sql='SELECT `u_id`, `username` FROM `login` WHERE `username`=? AND md5(`password` )=? limit 1 ';
            $stmt=$mysqli->prepare( $sql );
            if( !$stmt ) exit('Failed to prepare sql statement');
            $username=$_POST['username']; 
            $password=md5( $_POST['password'] ); 
            $stmt->bind_param('ss', $username, $password ); 
            $res=$stmt->execute();
            $login_user = null;
            $user_name = null;
            /* bind result to variable */
            $stmt->bind_result( $login_user, $user_name );
            while( $stmt->fetch() ){
                $_SESSION['u_id'] = $login_user;
                $_SESSION['username'] = $user_name;
            }
            $stmt->close();
            $mysqli->close();
            if( isset( $_SESSION['username'] ) ) exit( header( 'location: index.php' ) );
            else $error='Incorrect username or password.';
        }
    }
?>

会话.php

<?php
        if( !isset( $_SESSION ) ) session_start();
        if( !isset( $_SESSION['username'] ) ) exit( header('Location: index.php')  
        // Above is line 3
);
    ?>

测试登录.php

<?php 
      include 'resources/auth/session.php'; // If I only add this line I do not get any error
      include 'resources/includes/header.html'; // If I add the line I get the error in my question. But I need to include my header
    ?>
                                                          <!-- *** USER LOGGED IN ***-->
    <?php
    if ( isset( $_SESSION['username'] ) )                   
    {
    ?>
            <en><?php echo $_SESSION['username'];?></en><span class="caret"></span>
            <a href="index.php">Log Out</a>
                                                            <!-- *** USER NOT LOGGED IN ***-->
    <?php
    }
    ?>

必须在内容输出开始之前发送标头。如果在调用session_start();之前有任何空格或类似内容,您将看到此错误消息。

这是因为当PHP看到一个空格时,它不在<?php ?>之间,它将发送标头并开始以HTML形式发送内容,并且发送标头为时已晚。

您必须确保第一个文件直接以<?php开头,并在第一次发送所有标头时将其关闭。

如果你在开头不知道你的标头(所以不能发送它),你必须使用输出缓冲(http://php.net/manual/de/ref.outcontrol.php),这意味着PHP存储所有内容,直到脚本终止。

编辑:

也许分开会有所帮助

<?php include 'resources/auth/session.php' ?>

再做几行并添加一个;

<?php
 include 'resources/auth/session.php';
?>

编辑 2:

(也许注销按钮是一个新问题,您必须将其标记为已接受并打开一个新问题。

您必须删除会话,例如:

将注销链接指向index.php?todo=logout 并添加到标题.html:

<?php
    $error='';
    if( !isset( $_SESSION ) ) session_start();

    if( isset( $_GET['todo'] ) && $_GET['todo'] == 'logout'){
        //Session leeren
        session_unset();
        //Session zerstören
        session_destroy();
        //Session neu aufesetzen
        //  jetzt ist alles, was mit dem User zu tun hatte weg
        session_start();
        //Meldung
       echo 'You have been logged out!';
    }
    if( !isset( $_SESSION['username'])) include('resources/auth/login.php'); 
            else exit( header('Location: testlogin.php') ); 
    ?>
  <html>
    <body>
       <!-- Navigation code -->