2015-02-10 114 views
1

我正在處理運行查詢的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

回答

0

您可以在雙引號包住值:

而是連接字符串的,我喜歡用數組儘可能:

$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