PHP/MYSQL到CSV将代码打印到屏幕而不是CSV文件

PHP/MYSQL到CSV将代码打印到屏幕而不是CSV文件,php,mysql,csv,export-to-csv,Php,Mysql,Csv,Export To Csv,我无法让浏览器提示下载。输出将显示在屏幕上。我在这个网站上尝试了很多关于这个主题的其他帖子,但都没有用。我可以更改fopen(“php://output“,”w“到fopen(“export.csv”,“w”),但这将在服务器上保存export.csv文件的副本,我不需要。我希望在客户端下载文件,而不将其保存在服务器上。这是我的密码: $sql = mysql_query($_SESSION["export-query"]); $fields = mysql_num_fields($sql);

我无法让浏览器提示下载。输出将显示在屏幕上。我在这个网站上尝试了很多关于这个主题的其他帖子,但都没有用。我可以更改
fopen(“php://output“,”w“
fopen(“export.csv”,“w”)
,但这将在服务器上保存
export.csv
文件的副本,我不需要。我希望在客户端下载文件,而不将其保存在服务器上。这是我的密码:

$sql = mysql_query($_SESSION["export-query"]);
$fields = mysql_num_fields($sql);
$header = array();

for ($i = 0; $i < $fields; $i++) {
    $header[] = mysql_field_name($sql, $i);
}

$f = fopen("php://output","w"); 
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=export.csv');
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate');
fputcsv($f, $header);

while ($row = mysql_fetch_row($sql)) {
    fputcsv($f, $row);
}
fclose($f);
$sql=mysql\u查询($\u会话[“导出查询]);
$fields=mysql\u num\u字段($sql);
$header=array();
对于($i=0;$i<$fields;$i++){
$header[]=mysql\u字段\u名称($sql,$i);
}
$f=fopen(“php://output“,“w”);
标题(“内容类型:文本/csv”);
标题('Content-Disposition:attachment;filename=export.csv');
标题(“Pragma:public”);
标题('Expires:0');
标头(“缓存控制:必须重新验证”);
fputcsv($f,$header);
while($row=mysql\u fetch\u row($sql)){
fputcsv($f,$row);
}
外国法郎(f美元);

请帮忙!非常感谢。

您的代码与我的代码非常接近,但我有这个

header("Content-type: application/vnd.ms-excel");
对于内容类型。我认为这是可行的,因为浏览器知道如何处理文本/csv,但不知道如何处理excel。它将提示下载,因为它本身不会打开这种类型的文件

我也没有“必须重新验证”,但我不认为这有什么区别

编辑:

以下是我的完整标题,它们在100%的时间里都有效。和你的有一些细微的差别,所以也许其中一个原因就是原因

    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: attachment; filename=".$filename.".csv");
    header("Pragma: no-cache");
    header("Expires: 0");
编辑2:

从您对答案的评论来看,您将所有这些代码作为ajax调用放在一个div中。不起作用的原因是您只能在对页面的初始调用中设置标题。在ajax调用上设置标题将被忽略

下面是我的系统如何处理csv生成。因为我需要不同csv文件之间可能不同的特定信息,所以我将生成器文件的名称放入表单的“操作”中,并提供了一个提交按钮:

<form action="thegeneratorpage.php" method="get"><fieldset>
     <p>Download [...] in .csv (Excel) form.  You can narrow by [...].</p>
     <!-- code here that allows users to narrow down what is in the csv -->
     <input type="submit" value="Download" />
</fieldset></form>

以.csv(Excel)格式下载[…]。你可以缩小[…]的范围

如果信息不变,您可以这样做:

<a href="thegeneratorpage.php">Download CSV</a>


我们讨论过的所有代码都将在generatorPage.php上,而不是使用fputcsv函数,我建议只是像这样回显CSV文件的行(注意,我使用的标题与您的略有不同):


我的代码与此极为相似,没有带引号的字符串,而且运行良好。@spsc_tech我也在检查我自己的一个代码,它可以运行,并发现它也没有引号。@spsc_tech-您指的是哪一个带引号的字符串?不确定这是否适用,但上述导出到csv代码是由AJAX函数调用的,并且AJAX返回(xmlHttp.responseText)设置为显示在元素中。这是否超出了上述php代码中设置的标题?哦,是的,是的,这是您的问题。当标题已经发送时,您不能发送。fputcsv工作得很好。我不建议使用您发布的代码的原因是因为fputcsv会自动转义并正确地使用引号。如果
$v
中有双引号,则您的代码将中断。我添加了我的所有项目标题,这些标题可以满足您的需要。我也使用fopen和fputcsv等。我尝试了你的标题,但结果相同。它仍然只打印到屏幕上。我添加了更多关于如何执行您尝试执行的操作的信息。我将csv导出的代码分离到它自己的php文件(export.php)中,并创建了一个单独的javascript函数,该函数只调用export.php。基本上是window.location.assign(“export.php”)。它终于开始工作了!!!。。。除IE之外,我返回并将export.php中标题的顺序更改为:header('Pragma:');标头('Cache-Control:');标题(“内容类型:文本/csv”);标题('Content-Disposition:attachment;filename=export.csv');标头('Expires:0')。。。现在它可以在所有浏览器上运行!谢谢@spsc_techI我忘了javascript窗口。位置一。我倾向于在不必要的时候避免使用javascript(太多使用老式计算机的客户),并且我发布的两种解决方案都不会导致大多数浏览器的页面刷新。我很高兴你的工作顺利。
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$fileName}");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_row($sql)) {
    // optionally enclose data if necessary
    foreach ($row as $k => $v) {
        if (strpos($v, ',') !== false) {
            $row[$k] = '"' . $v . '"';
        }
    }
    echo implode(',', array_values($row));
}