2012-06-18 6 views
0

Je souhaite exporter au format CSV, mais l'hôte mutualisé que j'utilise a désactivé les fonctions FILE dans mysql. J'ai fait un SELECT simple, puis un fopen et un fwrite avec PHP.Export CSV sans fonctions MYSQL FILE

Le problème est que dans les champs il y a des retours chariot ou des guillemets. Comment les garder et construire un fichier csv correct?

Merci beaucoup.

+0

Il y a une fonction 'fputcsv', si votre hôte n'a pas désactivé cela - http://php.net/manual/fr/function.fputcsv.php – andrewsi

Répondre

0

Pour construire un meilleur CSV. vous pouvez faire comme suit.

$filename ='data.csv'; 
    $csv_terminated = "\n"; 
    $csv_separator = ","; 
    $csv_enclosed = '"'; 
    $csv_escaped = "\\"; 

$results = array('1','2','3');// value 

    $schema_insert = ''; 

    $header = array('a','b','c');// header 


    for ($i = 0; $i< count($header); $i++) 
    { 
     $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, 
      stripslashes($header[$i])) . $csv_enclosed; 
     $schema_insert .= $l; 
     $schema_insert .= $csv_separator; 
    } // end for 

    $out = trim(substr($schema_insert, 0, -1)); 
    $out .= $csv_terminated; 

    // Format the data 
    for($i=0;$i<count($results);$i++) 
    { 
     $row = $results[$i]; 
     $schema_insert = ''; 
     for ($j = 0; $j < count($header); $j++) 
     { 
      if ($row[$j] == '0' || $row[$j] != '') 
      { 

       if ($csv_enclosed == '') 
       { 
        $schema_insert .= $row[$j]; 
       } else 
       { 
        $schema_insert .= $csv_enclosed . 
        str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed; 
       } 
      } else 
      { 
       $schema_insert .= 'NULL'; 
      } 

      if ($j < count($header) - 1) 
      { 
       $schema_insert .= $csv_separator; 
      } 
     } // end for 

     $out .= $schema_insert; 
     $out .= $csv_terminated; 
    } // end while 

    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Content-Length: " . strlen($out)); 
    // Output to browser with appropriate mime type, you choose <img src="http://thetechnofreak.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley"> 
    header("Content-type: text/x-csv"); 
    //header("Content-type: text/csv"); 
    //header("Content-type: application/csv"); 
    header("Content-Disposition: attachment; filename=$filename"); 
    echo $out; 

Notez que, + quand vous faites pour la description ci-inclus qui a le code html, vous devez utiliser des guillemets doubles. + Valeur vide -> Passer au texte nul ou à la valeur zéro

Ils amélioreront votre CSV.

+1

Hiya bienvenue sur SO. Veuillez arrêter d'étiqueter vos réponses avec "spam". Il fronce les sourcils. Veuillez également lire [ce message] (http://meta.stackexchange.com/questions/5029/are-taglines-signatures-disallowed) à ce sujet. Profitez de votre séjour ici. – PeeHaa

0

Vous pouvez télécharger file.csv par tête d'utilisation()

de tout sortie que vous voulez (de base sur le format csv) après la fonction d'en-tête, par exemple:

$filename = "output"; 
    header('Content-Type: text/csv'); 
    header('Content-disposition: attachment;'.$filename.'=.csv'); 

    $separate = ","; //or ; 
    $endline = "\r\n"; 
    foreach($data as $key => $item) 
    { 
     echo $key.$separate.$value.$endline; 
    } 
0
protected function getCsv($fileName, array $data) 
    { 
     // alot of headers here, make force download work on IE8 over SSL 
     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private",false); 
     header("Content-Type: application/octet-stream"); 
     header('Content-Disposition: attachment; filename="'.$fileName.'"'); 
     header("Content-Transfer-Encoding: binary"); 

     // Joe Green says: 
     // based on http://www.php.net/manual/en/function.fputcsv.php#100033 

     $outStream = fopen("php://output", "r+"); 
     function __getCsv(&$vals, $key, $filehandler) { 
      fputcsv($filehandler, $vals, ',', '"'); 
     } 
     array_walk($data, '__getCsv', $outStream); 
     fclose($outStream); 
    } 

fputcsv est votre ami. De plus, j'ai dû affiner cette fonction pour arriver à ce point. Certains de ces en-têtes sont requis par IE pour forcer l'ouverture de csv en tant que csv, en particulier sur SSL. Je crois me rappeler que cela avait quelque chose à voir avec IE8 ne reconnaissant pas le type de contenu 'text/csv' dans la première instance et certaines fonctionnalités de sécurité autour des téléchargements SSL dans la seconde.