将用户input的查询导出到Excel – 只有HTML部分可见

我在这里要做的是让用户inputDATEFROM和DATETO。 然后,当用户点击button提取到Excel文件时,将执行查询将select在其中BETWEEN DATEFROM and DATETO的表中的所有列。 同时,它将下载一个excel文件,输出应该在那里。

我能够得到正确的查询,并输出在HTML中,但我有问题,导出到Excel。 以下是问题:

  1. 即使我不点击button,导出到Excel仍在工作。 当我在本地主机上运行程序时,它会自动导出到Excel文件。

  2. Excel文件里面只有HTML部分。

      <form method="POST" action=""> DATE FROM: <input type="date" name="datefrom"> TO: <input type="date" name="dateto"> <input type="submit" value="Extract excel file" name="extract"></input> </form> <?php header("Content-type: text/csv; charset=UTF-8"); header('Content-Disposition: attachment; filename=Export.csv'); if(isset($_POST['extract'])){ $con = mysql_connect("localhost", "root"); if(!$con){ echo "Error connection"; } $select_db = mysql_select_db('sample', $con); if(!$select_db){ echo "Error to select database"; } mysql_set_charset("utf8", $con); $datefrom = $_POST['datefrom']; $dateto = $_POST['dateto']; $myquery = mysql_query("SELECT * FROM biometrics WHERE date_created BETWEEN '" . $datefrom . "' AND '" . $dateto . "' ORDER BY empno"); //While loop to fetch the records $contents = "id_biometrics,empno,date_created,time_created,status\n"; while($row = mysql_fetch_array($myquery)) { $contents.=$row['id_biometrics'].","; $contents.=$row['empno'].","; $contents.=$row['date_created'].","; $contents.=$row['time_created'].","; $contents.=$row['status']."\n"; } $contents_final = chr(255).chr(254).mb_convert_encoding($contents, "UTF-16LE","UTF-8"); print $contents_final; } ?> </body> 

CSV文件被立即下载的原因是因为页面加载后您立即设置了这些标题。

  header("Content-type: text/csv; charset=UTF-8"); header('Content-Disposition: attachment; filename=Export.csv'); 

这是告诉浏览器采取什么行动,并将其保存到名为Export.csv的csv文件。 但是,您已经在响应正文(您的HTML)中输出数据,因此这些标题将作为数据发送。 当你使用PHP header()函数时,它必须在任何输出回到pipe道之前运行。

那么,你如何解决这个问题? 在你的php文件的最顶端,在那之前你想把一些东西的效果:

 <?php if(!empty($_POST)){ header("Content-type: text/csv; charset=UTF-8"); header('Content-Disposition: attachment; filename=Export.csv'); } 

然后启动剩余的HTML元素和PHP代码,或者告诉脚本结束并允许将内容作为文件发送。 等等等等等等

所以这里要说的是,标题必须在任何内容被发回之前被设置,并且这是为了你想做的任何事情。 如果你需要快速参考的话,这里是关于PHP头文件的完整文档:)

我将使用我的答案的第二部分两个nitpicks:1)mysql_ *函数集已弃用,尽快切换到使用mysqli_!

2)你的查询是开放的SQL注入攻击,得刷洗擦洗擦洗! 我的意思是使用预先准备的语句

这些行:

 header("Content-type: text/csv; charset=UTF-8"); header('Content-Disposition: attachment; filename=Export.csv'); 

正在造成强制下载。 他们应该在你的if(isset($_POST...

此外,你的PHP脚本需要在这个文件的最顶端,否则这将无法正常工作。 理想情况下,你会在你的if(isset($_POST

 header("Content-type: text/csv; charset=UTF-8"); header('Content-Disposition: attachment; filename=Export.csv'); print $contents_final; exit;