PHP:当流头在函数中时写入CSV文件


PHP: Writing to a CSV file while stream headers are in a function

我正试图用PHP将SQL查询写入CSV文件。多亏了[在前面的问题中][1]的一些建议,我已经做到了这一点。然而,我正在尝试减少代码中的重复,这在前面的例子中是可能的。

我在这里的一个函数中创建头/流包装器:

function csvCreate($filename){
    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作为参数:

if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight'))
{
    //csvCreate->$fileName .= 'OutputWeightNull.csv';
    csvCreate('OutputWeightNull.csv');
    $query = mysqli_query($conn, 'SELECT * FROM  `bfi_product_volumne_data` 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);
        }
    }
}

问题是数据没有写入CSV。我的感觉是,我需要将"fputcsv"调用指向函数。我已经尝试过使用"csvCreate->fputcsv",但似乎不起作用。有人能提出这里可能存在的问题吗。感谢

  [1]: http://stackoverflow.com/questions/33433737/php-writing-a-mysql-query-to-cs

问题是在函数内创建文件指针$fh。因此,它只在函数内部可见,而在函数外部不可见(可能是在将代码放入函数之前)。您需要将该变量从函数传递到外部世界。它可以用return来完成。然后,在"外部"世界中,您需要将返回的值分配给"外部"范围中的变量并使用它。

您需要在函数之外传递$fh。即

function csvCreate($filename){
    // .. rest of the code
    $fh = @fopen( 'php://output', 'w' );
    return $fh;
}

然后在编写输出的代码中执行以下操作,使$fh在该范围中可见。

// .. rest of the code
$fh = csvCreate('OutputWeightNull.csv');
// .. rest of the code