php - 将查询从用户输入导出到 Excel - 只有 HTML 部分可见

标签 php mysql database excel input

我在这里要做的是让用户输入 DATEFROM 和 DATETO。然后,当用户单击“提取到 Excel 文件”按钮时,将执行查询,它将从 BETWEEN DATEFROM 和 DATETO 的表中选择所有列。同时,它会下载一个 excel 文件,输出应该在那里。

我能够获得正确的查询并将其输出为 html,但在将其导出到 Excel 时遇到问题。以下是问题:

  1. 即使我没有单击该按钮,也可以导出到 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 。

    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/

相关文章:

php - 使用两个 foreach 循环将一个表的结果插入另一个表

mysql - 如何将多个表连接并分组连接到一个查询中

php - 将Mysql数据插入HTML表

javascript - 处理条形图中的点击事件

php - PHPUnit 6.5.5 和 PHP 7.2 的测试覆盖率

mysql - 在mysql数据库中存储字符长度~300,000的文本

php - 确定表是否具有连续的主 ID 自动增量值

mysql - 使用 case 语句优化查询

sql-server - VistaDB有什么缺点

php - HTACCESS - 在 URL 中使用空格