2010-05-16 4 views
0

Je regarde peut-être ceci de la mauvaise manière, mais j'ai une forme qui fait sa chose (envoie des courriels etc etc) mais j'ai aussi mis du code pour faire un simple fichier plat csv avec certains l'utilisateur a entré les détails. Si un utilisateur met accidentellement par exemple "himynameis", "bob" cela casserait la ligne csv (parce que les guillemets n'étaient pas encapsulés) ou si j'utilise htmlspecialchars() et stripslashes() sur les données, Je me retrouve avec une valeur de données laide de 'himynameis","bob'.encadrant des guillemets doubles dans le tableau

Ma question est, comment puis-je gérer les données entrantes pour répondre pour « " » être mis sous la forme sans casser mon fichier csv?

ceci est mon code pour créer le fichier journal csv.

@$name = htmlspecialchars(trim($_POST['name'])); 
@$emailCheck = htmlspecialchars(trim($_POST['email'])); 
@$title = htmlspecialchars(trim($_POST['title'])); 
@$phone = htmlspecialchars(trim($_POST['phone'])); 


function logFile($logText) 
{ 

    $path = 'D:\logs'; 
    $filename = '\Log-' . date('Ym', time()) . '.csv'; 
    $file = $path . $filename; 

    if(!file_exists($file)) 
    { 
     $logHeader = array('Date', 'IP_Address', 'Title', 'Name', 'Customer_Email', 'Customer_Phone', 'file'); 

     $fp = fopen($file, 'a');   

      fputcsv($fp, $line); 

    } 

    $fp = fopen($file, 'a'); 


    foreach ($logText as $record) { 
    fputcsv($fp, $record); 
} 




} 

//Log submission to file 
     $date = date("Y/m/d H:i:s"); 
     $clientIp = getIpAddress(); //get clients IP address 
     $nameLog = stripslashes($name); 
     $titleLog = stripslashes($title); 

     if($_FILES['uploadedfile']['error'] == 4) $filename = "No file attached."; //check if file uploaded and return 
     $logText = array(array("$date", "$clientIp", "$titleLog", "$nameLog", "$emailCheck", "$phone", "$filename")); 

     logFile($logText); //write form details to log 

Voici un échantillon des données de tableau entrant:

Array 
(
    [0] => Array 
     (
      [0] => 2010/05/17 10:22:27 
      [1] => xxx.xxx.xxx.xxx 
      [2] => title 
      [3] => """"himynameis","bob" 
      [4] => [email protected] 
      [5] => 346346 
      [6] => No file attached. 
     ) 

) 

TIA

Jared

Répondre

2

Vous pouvez modifier n'importe quel " dans l'entrée utilisateur à "". Ceci est recommandé par RFC 4180, et sera géré correctement par OpenOffice Calc et Excel, entre autres programmes.

Vous pouvez utiliser str_replace pour cela. Il sera probablement un peu plus rapide que preg_replace:

function csv_quote_escape($input) 
{ 
    return str_replace('"', '""', $input); 
} 
+0

yup, si j'encapsulent les guillemets doubles avec plus doublequotes, le csv est très bien (je sais que) je demande comment puis-je faire cela. Je pense peut-être preg_replace, ou y a-t-il un autre moyen? – Jared

+0

légende mate, bravo! – Jared

Questions connexes