0
function outputCSV($data) {
    $outstream = fopen("php://output", 'w');
    function __outputCSV(&$vals, $key, $filehandler){
        fputcsv($filehandler, $vals, ',', '"');
    }
    array_walk($data, '__outputCSV', $outstream);
    fclose($outstream);
}


function someFunctionInTheBigPHPFile() {
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=file.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    $mydata = array(
    array('data11', 'data12', 'data13'),
    array('data21', 'data22', 'data23'),
    array('data31', 'data32', 'data23'));

    outputCSV($mydata);
    exit;
}

出力CSVにはデータ配列が含まれています。問題は、この配列がWebページの残りの部分と一緒に表示されることです。つまり、この2つの関数が、fopenとファイルへの書き込みを処理する唯一の関数であるにもかかわらず、この関数が呼び出される前のすべてとその後のすべてです。

Webページの残りの部分が干渉するのを防ぐにはどうすればよいですか?CSVのデータ配列のみが必要です。

編集:exitを追加することで、配列に続くすべてのものを切り落とすことができましたが、配列の前にWebサイト全体が表示されるという問題があります。

4

3 に答える 3

1

CSVデータ出力後、実行を停止してください。die()またはでこれを行うことができますexit()

于 2012-05-20T23:04:10.593 に答える
1

PHPファイルの先頭で、CSVを印刷するかどうかをすぐに確認します(これはおそらく$_POSTまたは$_GETを介して渡されます)。その場合は、関数を直接実行し、その関数を出口で終了します。

これにより、CSVの作成前または作成後に何かが発生するのを防ぎます。何らかの理由で、ページのコンテンツがいつ計算されたかに関係なく、ファイルストリームが開いたり閉じたりした場合でも、ページ上のすべてのコードが新しいファイルに含まれます。

そして、これは事実上、あなたが望むものだけを残し、その前後のゴミは残しません。

于 2012-05-21T22:36:47.460 に答える
0

誤解しているかもしれませんが、someFunctionInTheBigPHPFile()がファイルを画面に出力します。それで、なぜあなたはこれを使用しているのですか?私はあなたが画面出力をしたくないのですか?

于 2012-05-20T23:08:55.643 に答える