Ecrivez au file .csv avec PHP (Commas in Data Error)

Je travaille sur une déclaration PHP qui exécute une requête puis écrit datatables dans un file .csv. Le problème que j'ai, c'est que certaines des données que je reçois du server comportent des virgules dans datatables qui proviennent du file .csv pour entrer des données au mauvais endroit. Ci-dessous, j'ai un exemple du code.

$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); 

La colonne trois est l'endroit où datatables contiennent des virgules qui leur permettent d'écrire sur différentes cellules dans le file .csv. Y a-t-il une solution pour que datatables [columnThree] se trouvent dans une seule cellule même si elle contient des virgules?

Vous pouvez envelopper les valeurs entre guillemets doubles:

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

Au lieu de concaténer une string, j'aime utiliser les arrays autant que possible:

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

Les deux approches auront un moment difficile avec un caractère différent dans vos données cependant – la citation double. Dans cet esprit, une alternative encore meilleure serait d'utiliser fopen et fputcsv pour créer vos données CSV et vous ne devez pas y penser.

Si vous prévoyez d'offrir immédiatement datatables CSV pour le téléchargement, vous n'avez pas besoin d'un file du tout, il suffit de le jeter dans le beurre de sortie:

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

… si vous voulez vous accrocher à un file, utilisez fopen sur le file de sortie souhaité et sautez l'appel à ob_start

Ensuite, assemblez vos données:

 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); 

… Si vous utilisez un file, vous êtes tous prêts! Si vous utilisez le tampon de sortie (aucun file utilisé), vous pouvez saisir datatables CSV et les envoyer directement au browser:

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

Soyez prudent avec le tampon de sortie, cependant, certains frameworks / applications l'utilisent en interne. Si vous rencontrez des problèmes, essayez d'utiliser un file. Si le file fonctionne, votre framework est probablement déjà en train de faire quelque chose avec le tampon de sortie.

Documentation