-4

当我测试我的脚本时,我得到了这个错误

Warning: Cannot modify header information - headers already sent by (output started at /nfs/c06/h04/mnt/153892/domains/authomotive.com/html/artpoint/gallery/index.php:12) in /nfs/c06/h04/mnt/153892/domains/authomotive.com/html/artpoint/gallery/main.php on line 17

我们当然都知道我删除了其他文件中的所有空格并将 ob_start() 和 ob_flush() 添加到文件中我还能做什么?我是否必须找到另一种发送标头的方法,或者是否有另一种方法可以绕过此警告?

该脚本从我的数据库和地图中删除了一个文件。

main.php 的来源

<?php 
ob_start();
    if(isset($_GET['remove'])){
        $id=$_GET['id'];
        include('conf.php');
        require_once('classes/db.class.php');
        $db = new DB($db_name,$db_host,$db_user,$db_passw);
        $q = $db->query('SELECT photourl,minurl,projectID FROM photo WHERE id='.$id);
            while ($line = $db->fetchNextObject()) {
                $file = $line->photourl;
                unlink($file);
                $filemin = $line->minurl;
                unlink($filemin);
            }
        //$db->execute('DELETE FROM project WHERE id='.$line->projectID,true);
        $db->execute('DELETE FROM photo WHERE id='.$id);
        header("Location:index.php");
    }
    if(isset($_GET['success'])){
        echo('het werkt');
    }
    ob_flush();
?>
<h1> Projecten </h1>

<ul id="edit-menu">
    <li>
        <ul>
            <li><a class="addPro" href="#"><img src="images/addProject.png" /></a></li><br/>
            <li><a class="add" style="padding-left:15px"href="#">Project +</a></li>
        </ul>

    </li>
    <li>
        <ul>
            <li><a class="addPho" href="#"><img src="images/add.png" /></a></li><br/>
            <li><a class="add" href="#">Toevoegen </a></li>
        </ul>
    </li>


    <li>
        <ul>
            <li><a class="deletePho" href="#"><img src="images/delete.png" /></a></li><br/>
            <li><a href="#">Verwijderen </a></li>
        </ul>
    </li>
    <div id="addproject">
        <?php include('addproject.php'); ?>
    </div>
    <div id="addphoto">
        <?php include('addphoto.php'); ?>
    </div>
    <div id="deletephoto">
        <?php include('removePhoto.php'); ?>
    </div>
</ul>
4

3 回答 3

2

很多时候,这个问题是由文件结尾处的空白行引起的,在<?php ... ?>标签之外。这些空行被 PHP 解释为需要输出的 (HTML) 内容的一部分。

在主 PHP 文件的情况下,它显然只适用于文件的开头,但是对于包含的文件,它们任一端的空行都可能导致输出发生,因此您的header()调用失败。

当然,它们生成的任何其他输出也将具有相同的效果,但是空行很容易成为人们遇到此问题的最常见原因,而无法弄清楚是什么内容导致了它,因为它并不明显,而且因为它是当您查看源代码以了解正在发生的事情时,很难发现一个杂散的空白行。

您应该检查程序加载的所有 PHP 文件,以确保不输出任何内容。特别检查文件的开头和结尾,以确保那里没有任何空行。

希望有帮助。

于 2012-11-19T22:20:09.293 回答
1

这里最有可能发生的是正在执行的文件index.phpinclude('main.php');. 但是,如果index.php在 include 之前已经发送了一些数据main.php,那么您将很难更改标题。

index.php可能有一些正在回显的空白行。这真的很容易被忽视。

此外,这是非常不安全的:

$db->execute('DELETE FROM photo WHERE id='.$id);

Web 安全规则 #1:永远不要信任客户端

于 2012-11-19T22:18:48.390 回答
0

您不能在 html 输出或回显之后使用标头。您仍然可以使用元或 javascript 重定向。

于 2012-11-19T22:16:46.417 回答