5

ダウンロード可能な CSV に MySQLi クエリを書き込もうとしています。次のヘッダーは、CSV のストリームを開きます。

$fileName = ''; //empty file name, file name is cast later
header("Cache=Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = @fopen( 'php://output', 'w' );

この下には、クエリの各行をクエリして、CSV ファイルの新しい行にキャストしようとする次のコードがあります。

if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')){
    $fileName .= 'OutputWeightNull.csv';
    $query = mysqli_query($conn, 'SELECT * FROM  `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL')or die(mysql_error());
    $result = mysqli_fetch_array($query) or die(mysql_error());
    $headerDisplayed = false;
    foreach ($result as $data){
    if (!headerDisplayed){
    fputcsv($fh, array_keys());
    $headerDisplayed = true;
        }
        fputcsv($fh, $data);
    }
}

CSV は必要に応じてブラウザーにダウンロードされますが、空のように見え、クエリ結果が CSV に送信されません。なぜこれが正しいのか、誰かが私を正しい方向に向けることができますか.

これは、Hello World よりも複雑な PHP スクリプトへの私の最初の試みです。答えが非常に単純または明白である場合はお詫び申し上げます。

4

3 に答える 3

3

返された行をループするようにコードをクリーンアップし、mysqli_ エラー関数を使用します。

<?php 

if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight'))
{
    $fileName = ''; //empty file name, file name is cast later
    header("Cache=Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Description: File Transfer');
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename={$fileName}");
    header("Expires: 0");
    header("Pragma: public");
    $fh = @fopen( 'php://output', 'w' );

    $fileName .= 'OutputWeightNull.csv';
    $query = mysqli_query($conn, 'SELECT * FROM  `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL') or die(mysqli_error($conn));
    if ($result = mysqli_fetch_array($query, MYSQLI_ASSOC))
    {
        fputcsv($fh, array_keys($result));
        fputcsv($fh, $result);
        while ($result = mysqli_fetch_array($query, MYSQLI_ASSOC))
        {
            fputcsv($fh, $result);
        }
    }
}
于 2015-10-30T11:05:00.737 に答える
2

MySQL には、データを CSV 形式に直接出力するためのクエリ タイプが組み込まれています。

SELECT次の形式になるようにクエリを変更します。

SELECT fieldlist FROM table
INTO OUTFILE 'filename.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

これで、ループなどを行う必要がなくなります。PHP がしなければならないことは、そのクエリを実行し、readfile()MySQL によって生成された CSV ファイルに対して a を実行し、最後にディスクから削除することだけです。

これにより、PHP プログラムのメモリが大幅に節約され、実行速度も大幅に向上します (データ セットが大きい場合は特に顕著です)。

于 2015-10-30T11:46:01.477 に答える