目前我正在开发一个PHP脚本,用于从MySQL数据库中的条目输出CSV文件。我的问题在于如何正确输出值。 MySQL数据库中的许多条目都包含逗号和引号,如果我只是将它们清楚地打印到文件中,它就会破坏CSV文件的格式。
我知道我可以在引号中包围文本,但包含引号的条目会弄乱文件的格式。
我的问题是,我该怎么做才能防止这种情况发生?
另外,新行会影响文件的解释吗?
另外,我宁愿不在PHP中使用fputcsv函数。我试图让PHP脚本输出文件的内容(带有适当的标题),而不是写入新文件。
提前致谢!
此致 celestialorb
答案 0 :(得分:6)
我认为你对fputcsv的解雇可能为时过早。在fputcsv手册的注释中,有一个例子,他们使用fputcsv输出到浏览器而不是文件。 http://php.net/manual/en/function.fputcsv.php
这是代码,加上一些标题,表明它确实提示用户下载csv文件。
$mydata = array(
array('data11', 'data12', 'data13'),
array('data21', 'data22', 'data23'),
array('data31', 'data32', 'data23'));
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"my-data.csv\"");
outputCSV($mydata);
function outputCSV($data) {
$outstream = fopen("php://output", 'w');
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals, ';', '"');
}
array_walk($data, '__outputCSV', $outstream);
fclose($outstream);
}
答案 1 :(得分:0)
我发现制表符分隔值文件在这些情况下很有用。 TSV不太容易受到数据中逗号等问题的影响。
答案 2 :(得分:0)
该过程称为转义,大多数解析器(包括PHP)使用反斜杠转义字符:
"This string contains literal \"quotes\" denoted by backslashes"
您可以使用addcslashes
转义字符串中的字符:
// escape double-quotes
$string = addcslashes('this string contains "quotes"', '"');
echo $string; // 'this string contains \"quotes\"'
如果要用逗号分隔数据数组,可以执行以下操作:
// Escape all double-quotes
foreach ($data as $key => $value)
$data[$key] = addcslashes($value, '"');
// Wrap each element in double quotes
echo '"' . implode('", "', $data), '"';