我在这里要做的是让用户输入 DATEFROM 和 DATETO。然后,当用户单击“提取到 Excel 文件”按钮时,将执行查询,它将从 BETWEEN DATEFROM 和 DATETO
的表中选择所有列。同时,它会下载一个 excel 文件,输出应该在那里。
我能够获得正确的查询并将其输出为 html,但在将其导出到 Excel 时遇到问题。以下是问题:
即使我没有单击该按钮,也可以导出到 Excel。当我在本地主机上运行该程序时,它会自动导出到 Excel 文件。
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 。
header("Content-type: text/csv; charset=UTF-8");
header('Content-Disposition: attachment; filename=Export.csv');
这告诉浏览器获取即将到来的内容并将其保存到名为 Export.csv 的 csv 文件中。但是,您已经在响应正文(您的 HTML)中输出数据,因此 header 将作为数据发送。当您使用 PHP header() 函数时,它必须在任何输出通过管道返回之前运行。
那么,你如何解决这个问题?在你的 php 文件的最顶部,在那之前你想要放置一些东西来达到以下效果:
<?php
if(!empty($_POST)){
header("Content-type: text/csv; charset=UTF-8");
header('Content-Disposition: attachment; filename=Export.csv');
}
然后开始其余的 HTML 元素和 PHP 代码,或者告诉脚本结束并允许将内容作为文件发送。 废话
所以这里的要点是,必须在任何内容发回之前设置 header ,这适用于您可能想做的任何事情。如果您需要快速了解,这里有关于 php header 的完整文档 reference :)
我将使用我的答案的第二部分来说明两个问题: 1) mysql_* 函数集已弃用,尽快改用mysqli_!
2) 您的查询对 SQL 注入(inject)攻击开放,必须擦洗擦洗擦洗!我的意思是使用 prepared statements
关于php - 将查询从用户输入导出到 Excel - 只有 HTML 部分可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20534335/