PHP:当流 headers 在函数中时写入 CSV 文件
PHP: Writing to a CSV file while stream headers are in a function
我正在尝试将 SQL 查询写入 PHP 中的 CSV 文件。多亏了[在上一个问题][1]中的一些建议,我已经有了这个工作。但是,我正在尝试减少我的代码中的重复,这在前面的示例中是可能的。
我在此处的函数中创建 headers/stream 包装器:
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]:
问题是您在函数内部创建了文件指针 $fh
。所以它只在函数内部可见,而不是在函数外部可见(因为它可能是在将代码放入函数之前)。您需要将该变量从函数传递到外部世界。可以用 return
来完成。然后在 'outer' 世界中,您需要将该返回值分配给 'outer' 范围内的变量并使用它。
你需要在函数外传递$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
我正在尝试将 SQL 查询写入 PHP 中的 CSV 文件。多亏了[在上一个问题][1]中的一些建议,我已经有了这个工作。但是,我正在尝试减少我的代码中的重复,这在前面的示例中是可能的。
我在此处的函数中创建 headers/stream 包装器:
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]:
问题是您在函数内部创建了文件指针 $fh
。所以它只在函数内部可见,而不是在函数外部可见(因为它可能是在将代码放入函数之前)。您需要将该变量从函数传递到外部世界。可以用 return
来完成。然后在 'outer' 世界中,您需要将该返回值分配给 'outer' 范围内的变量并使用它。
你需要在函数外传递$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