使用PHP写入.csv文件(数据错误中的逗号)

问题描述:

我正在处理运行查询的PHP语句,然后将数据写入.csv文件。我遇到的问题是,我从服务器接收的一些数据在导致.csv文件在错误位置输入数据的数据中包含逗号。下面我有一个代码示例。使用PHP写入.csv文件(数据错误中的逗号)

$sql = "Select * 
From table;" 

$data = mysqli_query($link, $sql); 
$row= ("Column One, Column Two, Column Three\n"); 

while ($result = $data->fetch_assoc()) { 
    $row .= ("$result[columnOne], $result[columnTwo], $result[columnThree]\n"); 
} 

$fd = fopen("./filePath.csv", "w") or die ("Error Message"); 
fwrite($fd, $row); 
fclose($fd); 

第三列是数据包含逗号的地方,这会导致它写入.csv文件中的不同单元。是否有任何解决方案使$ result [columnThree]数据保留在一个单元中,即使它包含逗号?

+4

使用'fputcsv()'写CSV数据,而不是'FWRITE()'。 [参考这里](http://php.net/manual/en/function.fputcsv.php) – 2015-02-10 21:48:43

+0

是的,并使用文本框,或者应用程序如何知道什么逗号是分隔符和什么是数据? – AbraCadaver 2015-02-10 21:56:14

您可以在双引号包住值:

而是连接字符串的,我喜欢用数组尽可能:

$rawCsv = array(); 
while ($result = $data->fetch_assoc()) { 
    if (count($rawCsv) === 0) 
     $rawCsv[] = '"'.implode('","', array_keys($result)).'"'; 
    $rawCsv[] = '"'.implode('","', $result).'"'; 
} 
$csvString = implode("\n", $rawCsv); 

这两种方法都会有尽管在数据中有一个不同的字符 - 双引号。考虑到这一点,更好的选择是使用fopenfputcsv来创建您的CSV数据,您不必考虑它。

如果您打算立即提供下载的CSV数据,你并不需要一个文件,同时,刚刚倾倒到输出黄油:

ob_start(); 
$file_handle = fopen("php://output", 'w'); 

...如果你想挂上的文件,然后在需要的输出文件中使用fopen并跳过调用ob_start

接下来,组装您的数据:

fputcsv($file_handle, array(
    'Your', 
    'headings', 
    'here' 
)); 

while ($result = $data->fetch_assoc()) { 
    fputcsv($file_handle, array(
     $result['Your'], 
     $result['data'], 
     $result['"here"'] 
    )); 
} 
fclose($file_handle); 

...如果你”重新使用一个文件,然后你全部设置!如果您使用的是输出缓冲器(不使用文件),你可以抓住的CSV数据并将其发送到直接在浏览器:

$csv = ob_get_clean(); 
echo $csv; // should send headers first! 

小心输出缓冲,虽然一些框架/应用程序使用它内部。如果您遇到问题,请尝试使用文件。如果该文件起作用,那么你的框架可能已经在输出缓冲区中做了一些事情。

文档

+0

为什么输出缓冲?缓冲区和'$ csv'将是空的。你没有输出任何东西。 – AbraCadaver 2015-02-10 21:58:25

+0

它在为文件句柄使用输出缓冲区时执行。如果您只是将它写入文件,那么在文件句柄中使用文件可能会更好。我会在答案中记下这一点。 – 2015-02-10 21:59:59

+0

Doh,我读过'fopen'行。 – AbraCadaver 2015-02-10 22:00:52