PHP - setcookie();不工作(无法修改标题信息 - 已发送的标题)

时间:2014-05-09 21:12:56

标签: php setcookie

我收到此错误:

  

警告:无法修改标题信息 - 第24行/removed/loginform.php中已经发送的标题(在/removed/loginform.php:2处开始输出)

据我所知,当我尝试设置一个cookie时,我收到了错误,这是因为setcookie之前没有任何输出...问题是,它之前没有输出(至少从我的内容)可以看到)。它说“<?php”是标题,我不明白。如果setcookie只能用于PHP和< ?php是一个标题,如果没有得到这个标题错误,甚至可以使用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>

3 个答案:

答案 0 :(得分:3)

<!--Database Connections-->是HTML输出,即使它只是一个评论。删除它,然后重试。

修改 PHP块之间还有一个空格。尝试将include放在主PHP块中。

答案 1 :(得分:1)

通常,这意味着您在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数据,手动检查这些函数。

始终检查所有包含的脚本(包括include,require等)。

确保他们开始<?php之前没有任何事情,并且在?>之后没有任何事情。

这是一个很好的例子:

<?php
  // some lines
?>

这些不是

something<?php ?>

<?php ?>something 

<?php  ?>

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

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

答案 2 :(得分:0)

试试这个:

<?php
// Database connections
include "../../includes/dbpractice_con.php";

//Declare variables
// ... proceed with code ...

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