-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 ... ?>多くの場合、この問題は、タグの外側のファイルの先頭または末尾にある空白行が原因で発生します。これらの空白行は、出力する必要がある (HTML) コンテンツの一部として PHP によって解釈されます。

メインの PHP ファイルの場合、明らかにファイルの先頭にのみ適用されますが、インクルードされたファイルでは、ファイルの両端に空白行があると出力が発生し、header()呼び出しが失敗する可能性があります。

もちろん、それらが生成する他の出力も同じ効果がありますが、空白行は、明らかではないため、どのコンテンツが原因であるかを突き止めることができずに、人々がこの問題を起こす最も一般的な原因です。ソースを表示して何が起こっているのかを理解するときに、1 行の空白行を見つけるのは困難です。

プログラムによってロードされたすべての PHP ファイルをチェックして、何も出力しないことを確認する必要があります。具体的には、ファイルの先頭と末尾をチェックして、そこに空白行がないことを確認してください。

それが役立つことを願っています。

于 2012-11-19T22:20:09.293 に答える
1

ここで発生している可能性が最も高いのは、実行されているファイルが でありindex.php、これが を使用しているということinclude('main.php');です。しかし、をindex.phpインクルードする前にすでにいくつかのデータを送信している場合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 に答える