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

我正在处理运行查询的PHP语句,然后将数据写入.csv文件。 我遇到的问题是我从服务器收到的一些数据在数据中有逗号,导致.csv文件在错误的地方input数据。 下面我有一个代码的例子。

$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文件中的不同单元格。 有没有解决scheme,使$ result [columnThree]数据保留在一个单元,即使它包含逗号?

你可以用双引号括住这些值:

 $row .= ('"'.$result['columnOne'].'", "'.$result['columnTwo'].'", "'.$result['columnThree'].'"\n"'); 

而不是连接string,我喜欢尽可能使用数组:

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

这两种方法在你的数据中都会有一个不同的字符 – 双引号。 考虑到这一点,更好的select是使用fopenfputcsv来创buildCSV数据,而不必考虑它。

如果您打算立即提供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! 

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

文档