PHP - setcookie();不能工作(不能修改报头信息-报头已经发送)


PHP - setcookie(); not working ( Cannot modify header information - headers already sent )

我得到这个错误:

警告:无法修改报头信息-报头已经由(output started at/removed/loginfo .php:2)在/removed/loginfo .php第24行

我明白,当我尝试设置cookie时,我得到了错误,这是因为setcookie在它之前不能有任何输出…问题是,在它之前没有输出(至少从我可以看到的)。它在说"我代码:

<!--Database Connections-->
<?php include "../../includes/dbpractice_con.php"; ?>
<?php 
//Declare variables
$username = "";
$password = "";
$message = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") { //Retrieve from form when submit is clicked.
    //Escape to prevent SQL injection.
    $username = mysqli_real_escape_string($connection, $_POST['username']);
    $password = mysqli_real_escape_string($connection, $_POST['password']);
    $check = mysqli_query($connection, "SELECT * FROM users WHERE username='$username' AND password='$password'");
    $rowCount = mysqli_num_rows($check);
    if ($rowCount == 1) {
        $cookieExpiration = time() + 757368000; //1 year
        setcookie("username", $username, $cookieExpiration);
    } else {
        $message = "Invalid username or password. <br/>Don't have an account? Click <a href='"registerform.php'">here</a> to register.<br/><br/>";
    }
}

?>
<html>

<!--Database Connections-->是HTML输出,即使它只是一个注释。删除它,然后再试一次。

编辑:

PHP块之间也有一个空格。

一般来说,这意味着您在setcookie()调用之前已经向客户端发送了一些内容。

做简单测试:

<?php
  ob_start();
  include "../../includes/dbpractice_con.php"; ?>
  # ... rest of your code... #

和setcookie()之前调用add line

ob_get_clean();

只是为了确保之前没有输出。

<?php ?>之外的任何内容都是HTML并发送给用户。这

<!--Database Connections-->
<?php include "../../includes/dbpractice_con.php"; ?>

输出<!--Database Connections-->作为HTML注释。另一个可能的输出在这里

<?php include "../../includes/dbpractice_con.php"; ?>
<?php ...

至少在两个PHP标记之间有新的行字符,这也是不想要的输出。

在cookieset()调用之前不能有任何东西要回显,print_r, var_dump数据,手动检查这些函数

总是检查所有包含的脚本(包括,要求等)。

确保它们以<?php开头,前面无内容,以?>结尾,后面无内容。

这是一个很好的例子:

<?php
  // some lines
?>

这些不是

something<?php ?>

<?php ?>something 

<?php  ?>

(如果文件已保存为UTF-8)。

查看您的dbpractice_con.php,检查它是否保存为ANSI(从记事本检查另存为对话框),确保所有内容都在标签之间,并且在标签前后没有一个字符。不要在同一个脚本中使用多个标签,因为这会增加不必要输出的风险。

试试这个:

<?php
// Database connections
include "../../includes/dbpractice_con.php";
//Declare variables
// ... proceed with code ...

如果这不起作用,那么问题可能在dbpractice_con.php