-1

我浏览了这个网站,发现了大量关于同一件事的线索,但没有一个能真正帮助像我这样的新手,因为我不能正确理解答案。

我从数据库中选择了数据并显示在网页上的表格中。我现在需要此表下方的链接,该链接会将这些数据导出到 CSV 文件。

我在这个网站上找到的答案之一是:为 PHP 中的用户创建一个 CSV 文件

然而,答案对我来说真的没有意义,我不知道如何处理代码。

这是该答案的代码:

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 文件,也没有发生错误

4

4 回答 4

1

该代码创建了一个新的文件对象,该对象输出到标准输出,然后由于之前发送的标头而作为下载提供给用户。

那是你的数据;关联数组的数组。你如何填写它取决于你。

函数的调用是在定义之前,因为PHP首先在顶层完全解析文件,所以函数实际上会在调用时定义。这不适用于 if 语句中的函数。

该函数的值由标准函数 fputcsv 提供。

您使用的代码几乎与呈现的完全一样。

于 2013-05-14T13:43:54.297 回答
0

header函数用于向用户代理发送有关响应的附加信息。这些附加信息作为HTTP header-fields传递。见标题

header("Content-type: text/csv");:此代码将告诉用户代理或浏览器,它将接收的内容是 CSV 文件。请参阅内容类型

header("Content-Disposition: attachment; filename=file.csv");:此代码告诉用户代理或浏览器接收此内容作为附件,并且此附件的名称为file.csv。浏览器可能会将此内容保存在“下载”文件夹中,或者要求用户在本地保存该文件,具体取决于浏览器设置。见内容处置

header("Pragma: no-cache");: 相应地使用HTTP/1.1。规范中,该指令具有相同的含义Cache-Control: no-cache。该Pragma: no-cache指令用于向后兼容 HTTP/1.0。见编译指示

header("Expires: 0");此代码可防止用户代理缓存生成的内容。因此,每次用户请求其内容时,浏览器都会向服务器发出请求。请参阅过期

$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并关闭文件。见关闭

于 2013-05-14T16:36:16.420 回答
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都有一个,并将该行中的值放在里面array行数组。

变量是传递给你给array_walk函数的回调函数的参数。array_walk获取一个数组,遍历其中的每个项目,并对项目应用一个函数,在这种情况下,它遍历行数组,并将每个行数组作为 CSV 写入打开的文件。所以$vals将始终包含行数组,$key在这里被忽略,但它将包含访问的数组项的索引或键,并且$filehandler$outstream传入的变量,它是用于将值写入文件的打开文件处理程序。

最后,在 PHP 中,您可以在使用函数之后定义函数,只要它们在同一范围内即可。

于 2013-05-14T13:50:21.027 回答
0

第 3 行 - 查询您的数据库(这取决于您如何连接到数据库,我正在使用类)
第 4 行 - 获取数据(这取决于您如何连接到数据库)

但是你可以使用你的连接,只是获取你的数据,当你这样做时,不要显示来自数据库的数据,将它添加到 variable $csv.='some string'。当您获取所有数据时,显示headers(它将创建 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!";
}
于 2013-05-14T13:45:05.717 回答