PHP生成的CSV文件:最后一个值被截断


CSV generated file in PHP : last value is truncated

在CodeIgniter 2中,我使用以下代码从我的Oracle数据库(数据量可以少于10行到数十万行,这就是为什么我"取消设置"每个$行)中获取数据生成CSV文件:

        $conn = $this->db;
        $stid = oci_parse($conn->conn_id, $sql);
        oci_execute($stid);
        // Header extraction
        $headers = "";
        $values = "";
        $row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS );
        foreach($row as $key => $value) {
            $headers = $headers.$key.';';
            $values = $values.$value.';';
        }
        // Remove of last comma and adding in a line break
        $headers = substr($headers,0,-1). "'r'n";
        $values = substr($values,0,-1). "'r'n";
        $data = $headers . $values;
        $values = "";
        // Parsing all data to concatenate the values
        while (($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
            $line = "";
            foreach ($row as $key => $value) {
                $line .= $value . ';';
            }
            $line = substr($line, 0, -1) . "'n";
            $data = $data . $line;
            // Freeing memory for the line
            unset($line);
        }
        return $data;

使用这段代码,我的CSV文件是正确生成的,除了一件事。

当我只导出少量行时,一切正常。我有所有行的所有值,用逗号分隔。但是,当我导出几百或几千行时,来自LAST行的LAST值总是被截断5个字符(数据库中的数据是OK的)。

HEADER1;HEADER2;HEADER3;HEADER4;HEADER5
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
[.......]
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX

我以为可能是缓存限制之类的,但它发生在导出几百行之后,不管它是几百行还是几十万行。

我看不懂这个

有人能帮忙吗?

本文描述的原始问题与代码无关。

问题来自CodeIgniter force_download()函数(来自CI下载助手)传递的头内容长度。

header("Content-Length: ".strlen($data));

strlen($data)不返回(在我的情况下)正确的数据长度,然后我的浏览器只下载在头中传递的数据量,因此在末尾截断几个字符。

没有发现任何关于这个"问题",我决定注释掉标题内容长度行