无法修改标头信息 - 标头已由以下人员发送:PHP


Cannot modify header information - headers already sent by: PHP

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <title></title>
    </head>
    <body>
<?php
    if ($_POST['password'] != $_POST['confirmpassword'])
    {        
        $password = md5($_POST['password']);
        $confirmPass = md5($_POST['confirmpassword']);        
        echo "<script type='text/javascript'>alert('Error. Passwords do not match.');</script>";    
        header("Refresh:0; Registration.html"); 
    }
    else 
    {
        $password = md5($_POST['password']);
        $confirmPass = md5($_POST['confirmpassword']);
        echo 'Name: '.$_POST['firstname'].' '.$_POST['lastname']. '<br>';
        if($_POST['agerange'] == 1)
        {
            echo "Under 18<br>";
        }
        elseif($_POST['agerange'] == 2)
        {
            echo "Age 18-24<br>";
        }
        elseif($_POST['agerange'] == 3)
        {
            echo "Age 25-34<br>";
        }
        elseif($_POST['agerange'] == 4)
        {
            echo "Age 35-44<br>";
        }
        elseif($_POST['agerange'] == 5)
        {
            echo "Age 45-54<br>";
        }
        elseif($_POST['agerange'] == 6)
        {
            echo "Age 55-64<br>";
        }
        else
        {
            echo "Age 65 or older<br>";
        }
        if ($_POST['sex'] == 'male')
        {
            echo "Gender: Male<br>";
        }
        else
        {
            echo "Gender: Female<br>";
        }
        echo 'Phone Number: '.$_POST['daytimephone']. '<br>';
        echo 'Email: '.$_POST['email']. '<br>';
        echo 'Username: '.$_POST['username']. '<br>';
        if(isset($_POST['specialoffers']))
        {
            echo "You would like to recieve special offers from us via email.";
        }
        else
        {
            echo "You would NOT like to recieve special offers from us via email.";
        }
    }
?>  
    </body>
</html>

所以这个PHP脚本调用我的注册.html表单。当密码字段与确认密码字段不匹配时,会发布一条警报,指出它们不匹配,然后应刷新页面。出于某种原因,我无法弄清楚为什么它会踢出此错误:无法修改标头信息 - 标头已由 (输出从文档''我的网站''第 2 周''练习 4.php''注册.php:8 开始)在第 14 行的文档''我的网站''第 2 周''练习 4''注册:8)有人对如何解决这个问题有建议吗?我想要的只是在密码字段不匹配时刷新注册表。

在修改标头之前,您无法输出任何内容。这意味着:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <title></title>
    </head>
    <body>

而这个:

 echo "<script type='text/javascript'>alert('Error. Passwords do not match.');</script>";  

不好。

除了其他人提到的安全方面之外,确保两个密码匹配的最佳方法是在使用jQuery valid或类似的东西提交表单之前。

如果您必须这样做,最好将消息存储在会话变量中,然后将其输出到另一个页面上:

if ($_POST['password'] != $_POST['confirmpassword'])
    {        
        $password = md5($_POST['password']);
        $confirmPass = md5($_POST['confirmpassword']);        
        $_SESSION["msg"] =  "Error. Passwords do not match.";
        header("Location: Registration.php");
    }

注册时.php:

if (isset($_SESSION["msg"])){
echo "<script type='text/javascript'>alert('" . $_SESSION["msg"] . "');</script>";
unset($_SESSION["msg"]);
}