我正在处理运行查询的PHP语句,然后将数据写入.csv文件。我遇到的问题是我从服务器收到的一些数据在数据中有逗号,导致.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]数据保留在一个单元格中,即使它包含逗号?
答案 0 :(得分:0)
您可以将值换成双引号:
$row .= ('"'.$result['columnOne'].'", "'.$result['columnTwo'].'", "'.$result['columnThree'].'"\n"');
我喜欢尽可能多地使用数组,而不是连接字符串:
$rawCsv = array();
while ($result = $data->fetch_assoc()) {
if (count($rawCsv) === 0)
$rawCsv[] = '"'.implode('","', array_keys($result )).'"';
$rawCsv[] = '"'.implode('","', $result ).'"';
}
$csvString = implode("\n", $rawCsv);
这两种方法都会在数据中遇到不同的特征 - 双引号。考虑到这一点,更好的选择是使用fopen
和fputcsv
来创建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!
小心输出缓冲,但是,一些框架/应用程序在内部使用它。如果您遇到问题,请尝试使用文件。如果文件有效,那么你的框架可能已经在使用输出缓冲区了。
<强>文档强>
implode
- http://php.net/function.implode fopen
- http://php.net/manual/en/function.fopen.php fclose
- http://php.net/manual/en/function.fclose.php fputcsv
- http://php.net/manual/en/function.fputcsv.php ob_start
- http://php.net/manual/en/function.ob-start.php ob_get_clean
- http://php.net/manual/en/function.ob-get-clean.php