2012-06-18 11 views
0

Я хотел бы сделать экспорт в формате CSV, но используемый мной общий пользовательский хост дезактивирует функции FILE в mysql.CSV-экспорт без функций MYSQL FILE

Я сделал простой SELECT, а затем fopen и fwrite с PHP.

Проблема в том, что в полях есть возврат каретки или двойные кавычки.

Как сохранить их и создать правильный файл csv?

Большое спасибо.

+0

Есть функция 'fputcsv', если ваш хост не отключил это - http://php.net/manual/en/function.fputcsv.php – andrewsi

ответ

0

Чтобы построить лучший CSV. вы можете сделать следующий путь.

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

Обратите внимание, что, +, когда вы сделаете прилагается для описания, которое имеет HTML-код, вы должны использовать двойные кавычки. + Пустое значение -> Изменить на нулевой текст или нулевое значение

Они сделают ваш CSV лучше.

+1

Hiya приветствую SO. Пожалуйста, прекратите помечать свои ответы «спамом». Он нахмурился. Пожалуйста, также прочитайте [этот пост] (http://meta.stackexchange.com/questions/5029/are-taglines-signatures-disallowed) об этой теме. Наслаждайтесь отдыхом здесь. – PeeHaa

0

Вы можете скачать file.csv с использованием заголовка()

Выход все, что вы хотите (база на формате CSV) после заголовка функции, например:

$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 - ваш друг. Кроме того, мне пришлось уточнить эту функцию, чтобы довести ее до этого момента. Некоторые из этих заголовков требуются IE, чтобы заставить csv открываться как csv, особенно через SSL. Кажется, я помню, что это связано с тем, что IE8 не распознает тип контента «text/csv» в первом экземпляре, а некоторые функции безопасности вокруг загрузки SSL во втором.

Смежные вопросы