如何将Javascript对象传递给php以进行sql查询,并将数据作为下载的csv文件返回


How to pass Javascript object to php to make sql query and return data as a downloaded csv file?

我使用jquery将get查询设置为php脚本,然后该脚本查询数据库并写入屏幕,但我无法使用它来触发下载,即使使用标头也是如此。

步骤如下:

  1. 创建一个链接,用户点击该链接下载数据

  2. javascript将查询参数发送到php

  3. php查询数据库并写入文件

  4. 客户端下载文件

但我无法实现第四步。

步骤1:(这是一个表对象,也包含参数:

d3.select("#some-div").append('a")
    .attr("href", "javascript: void(0)")
    .on("click", function() { this.saveAsCSV() };

步骤2:Javascript文件进行查询:

var saveAsCSV = function(params) {
    var tmp_params = $.extend({}, params);
    tmp_params['State'] = "NM";
    $.get('php/get_data.php', tmp_params);
}

php返回查询:

...
header("Content-type: application/text-csv");
header("Content-Disposition: attachment; filename=query_result.csv");
while($row = $result->fetchArray() {
    print "$row";
}
...

它的工作原理很好,因为它可以正确地查询并打印javascript函数中的数据(因此,如果我将其添加到get return函数中,它会将其打印到console.log),但我不知道应该采取什么不同的做法,让它直接下载。

我尝试过的一件事是对params对象执行以下操作:

var param_string = encodeURIComponent(JSON.stringify(params));
location.href = 'http://www.mysite.com"+param_string;

但这既会让用户离开页面,又无法下载数据。

编辑:我应该澄清一下,php文件确实以csv格式很好地输出了查询。问题似乎是,无论php头是什么,使用$.get()函数都不会触发下载。也许我只需要提供一个带有URL地址中参数的简单链接,但我不确定如何将javascript对象转换为URL格式,以便php脚本可以对其进行解释。

您可以使用URL php/get_data.php?State=NM(可能是其他参数)打开一个弹出窗口/新窗口/选项卡/任何内容。它应该下载输出。

但是您的输出可能是错误的,因为您只是打印变量$row,它是一个数组。如果您尝试以这种方式打印数组,它只会显示Array

您需要正确地输出行。不幸的是,我不太了解CSV结构,无法帮助您解决这个问题。

您可以使用类似jQuery的东西对此进行AJAX调用,它会弹出下载框,同时让用户留在页面上。这样做:

$.ajax({data: {download: 'query_result.csv'}, type: 'GET', url: 'download.php', cache: false });

我为以前的雇主试过几次,效果总是很好。尽管我主要使用.zip和.docx文件。

我想通了!

基本上,我的编码是错误的。我不想用编码

encodeURIComponent(JSON.stringify(params));

php脚本无法读取结果。然而,只使用$.param().是可行的

总之,下载是通过创建URL链接,然后使用location.href链接来触发的。因此,其他一切都是一样的,但不是步骤2中的$.get(),而是:

var url_params = $.param(tmp_params);
location.href = url_params;

它生成下载。谢谢