我已经通过这个网站进行了搜索,并发现了很多关于同样事情的线索,但没有一个像我这样完全没有新手,因为我不能正确理解答案。
我从数据库中选择了数据并显示在网页上的表格中。我现在需要在此表下方的链接,该链接将此数据导出为CSV文件。
我在本网站上找到的答案之一是:Create a CSV File for a user in PHP
然而,答案对我来说真的没有意义,我不知道如何处理代码。
以下是该答案的代码:
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
$array = array(
array("data11", "data12", "data13"),
array("data21", "data22", "data23"),
array("data31", "data32", "data23"));
outputCSV($array);
function outputCSV($data) {
$outstream = fopen("php://output", "w");
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals); // add parameters if you want
}
array_walk($data, "__outputCSV", $outstream);
fclose($outstream);
}
我有很多问题需要先创建一个excel文件吗?如果是这样,它需要是空白的吗?
这是什么?:$array = array(
array("data11", "data12", "data13"),
array("data21", "data22", "data23"),
array("data31", "data32", "data23"));
这应该是我的数据吗?我如何改变它以适应我的数据?
为什么在定义函数之前调用函数?
函数中的这些变量是什么($ vals,$ key,$ filehandler)以及它们在哪里创建?
我如何使用此代码,因为很多人似乎认为它是完美的。
我从头到尾都需要帮助,因为我是一个完整的PHP新手
我已经完成了下面的一个答案,现在我有了这个代码
$i=0;
$csv="";
for ($a=0; $a<=$count; $a++) {
$i++;
$csv.=preg_replace("/\n/",'',preg_replace("/,/",';',$serveys[$a]['FeedbackName'])).",".
preg_replace("/\n/",'',preg_replace("/,/",';',$serveys[$a]['BranchName']));
$csv.="\n";
}
if ($i>0) {
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=\"table.csv\";" );
header("Content-Transfer-Encoding: binary");
echo $csv;
} else {
return "Nothing to download!";
}
当我运行页面虽然没有变化时,数据仍然显示在页面上。但没有创建csv文件且没有错误发生
答案 0 :(得分:1)
代码创建了一个新的文件对象,输出到标准输出,然后由于之前发送的标题而提供给用户。
这是你的数据;一组关联数组。你如何填写它取决于你。
在定义函数之前调用函数是因为PHP首先完全解析顶级文件,因此函数实际上将在调用时定义。这不适用于if语句中的函数。
函数的值由标准函数fputcsv提供。
您使用的代码几乎与呈现的完全相同。
答案 1 :(得分:0)
第3行 - 查询你的数据库(这取决于你如何连接到数据库,我正在使用类)
第4行 - 获取数据(这取决于你如何连接到数据库)
但您可以使用连接,只需获取数据,当您执行此操作时,不要显示数据库中的数据,将其添加到变量$csv.='some string'
。当您获取所有数据时,显示header
(它将创建csv文件),然后显示您的所有数据。
","
- 新细胞
"\n"
- 新行
这就是我使用preg_replace
的原因,因为如果您的数据库中的单元格为,
,则此逗号会创建新单元格,而您不希望这样,因此您可以将其替换为;
。
您无需创建csv文件,您的文件名称在此行header("Content-Disposition: attachment; filename=\"table.csv\";" );
- table.csv
$i=0;
$csv="";
$res=$db->query('SELECT * FROM `table_name`');
while ($row=$res->fetch()) {
$i++;
$csv.=preg_replace("/\n/",'',preg_replace("/,/",';',$row['col1'])).",".
preg_replace("/\n/",'',preg_replace("/,/",';',$row['col2'])).",".
preg_replace("/\n/",'',preg_replace("/,/",';',$row['col3'])).",".
preg_replace("/\n/",'',preg_replace("/,/",';',$row['col4'])).",".
preg_replace("/\n/",'',preg_replace("/,/",';',$row['col5']));
$csv.="\n";
}
if ($i>0) {
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=\"table.csv\";" );
header("Content-Transfer-Encoding: binary");
echo $csv;
} else {
return "Nothing to download!";
}
答案 2 :(得分:0)
您突出显示的部分是二维数组值,非常类似于电子表格(在本例中为CSV文件)。最外面的数组将您可以想象为行的数组保存在一起。该数组中的每个值都写入一列。所以从这个:
$array = array(
array("data11", "data12", "data13"),
array("data21", "data22", "data23"),
array("data31", "data32", "data23"));
,你会得到一张这样的表:
----------------------------
| data11 | data12 | data13 |
----------------------------
| data21 | data22 | data23 |
----------------------------
| data31 | data32 | data33 |
----------------------------
您如何更改此数据取决于您从数据库中获取数据的方式,但基本原则是相同的:将所有数据放在array
中,有一个{{1}对于每一行,并在行数组中包含该行中的值。
变量是传递给您为array_walk
函数提供的回调函数的参数。 array
接受一个数组,遍历其中的每个项目,并在项目上应用函数,在这种情况下,它遍历行数组,并将每个行数组作为CSV写入打开的文件。因此array_walk
将始终包含行数组,此处忽略$vals
但它将包含所访问的数组项的索引或键,$key
是传递的$filehandler
变量in,这是用于将值写入文件的打开文件处理程序。
最后,在PHP中,您可以在函数之后定义函数,只要它们在同一范围内即可。
答案 3 :(得分:0)
header
函数用于向用户代理发送有关响应的附加信息。这些adtional信息以HTTP header-fields传递。请参阅header。
header("Content-type: text/csv");
:此代码会告知用户代理或浏览器,它将收到的内容是CSV文件。请参阅Content-type。
header("Content-Disposition: attachment; filename=file.csv");
:此代码告诉用户代理或浏览器将此内容作为附件接收,并且此附件的名称为file.csv
。浏览器可能会将此内容保存在“下载”文件夹中,或者向用户请求本地保存该文件,具体取决于浏览器设置。见Content-Disposition
header("Pragma: no-cache");
:相应地使用HTTP/1.1. specification,此指令与Cache-Control: no-cache
的含义相同。 Pragma: no-cache
指令用于向后兼容HTTP / 1.0。见Pragma
header("Expires: 0");
此代码阻止用户代理缓存生成的内容。因此,每次用户询问内容时,浏览器都会向服务器发出请求。请参阅Expires。
$array = array(
array("data11", "data12", "data13"),
array("data21", "data22", "data23"),
array("data31", "data32", "data23"));
此代码创建一个3x3二维数组,即3行和3列。
outputCSV($array);
:此代码将调用outputCSV
函数,将二维数组作为参数传递
$outstream = fopen("php://output", "w");
:
fopen函数用于打开文件进行读写。此函数返回该文件的处理程序,因此您可以在该文件中执行i / o操作。见fopen
当你使用"php://output"
时,你告诉PHP文件处理程序的任何写操作都将在标准输出中完成。因此命令fwrite($fhandler, "Hello World!")
具有与echo "Hello World!"
相同的结果。见php://
"w"
表示该文件仅为写入操作打开。
array_walk($data, "__outputCSV", $outstream)
用于为作为第一个参数传递的数组的每个元素执行一个函数。这样,它将执行执行fputcsv的__outputCSV函数。见array_walk
fputcsv
将数组内容写入文件中。数组的每个元素将由分隔符分隔。默认定界符是(逗号)。见fputcsv
由于您有3x3阵列,array_walk
将执行fputcsv
功能3次。第一次为array("data11", "data12", "data13")
,第二次为array("data21", "data22", "data23")
,最后一次为array("data31", "data32", "data23")
。
反过来,fputcsv
将输出以下内容:
"data11","data12","data13"
"data21", "data22", "data23"
"data31", "data32", "data23"
最后,使用了fclose
。这将输出先前与fputcsv
一起发送的缓冲数据,并将关闭该文件。见fclose