Экспорт CSV из Mysql

У меня возникли проблемы с экспортом файла csv, который создается из одной из моих таблиц mysql, используя php.

Код, который я использую, печатает правильные данные, но я не вижу, как загрузить эти данные в файле csv, обеспечивая ссылку для загрузки созданного файла. Я думал, что браузер должен автоматически предоставить файл для загрузки, но это не так. (Может быть, потому что приведенный ниже код вызывается с помощью ajax?)

Любая помощь очень ценится – код ниже, S.

include('../cofig/config.php'); //db connection settings $query = "SELECT * FROM isregistered"; $export = mysql_query($query) or die("Sql error : " . mysql_error()); $fields = mysql_num_fields($export); for ($i = 0; $i < $fields; $i++) { $header .= mysql_field_name($export, $i) . "\t"; } while ($row = mysql_fetch_row($export)) { $line = ''; foreach ($row as $value) { if ((!isset($value) ) || ( $value == "" )) { $value = "\t"; } else { $value = str_replace('"', '""', $value); $value = '"' . $value . '"' . "\t"; } $line .= $value; } $data .= trim($line) . "\n"; } $data = str_replace("\r", "", $data); if ($data == "") { $data = "\n(0) Records Found!\n"; } //header("Content-type: application/octet-stream"); //have tried all of these at sometime //header("Content-type: text/x-csv"); header("Content-type: text/csv"); //header("Content-type: application/csv"); header("Content-Disposition: attachment; filename=export.csv"); //header("Content-Disposition: attachment; filename=export.xls"); header("Pragma: no-cache"); header("Expires: 0"); echo '<a href="">Download Exported Data</a>'; //want my link to go in here... print "$header\n$data"; 

Вы не можете иметь текст и загрузку на той же странице. Вам нужно иметь ссылку на область загрузки, которая может быть просто параметром GET, ведущим к функции, которая затем выполняет всю обработку, отображает заголовки и перекликается с содержимым CSV.

Например, у вас может быть <a href="foo.php?action=download">Click here to download CSV</a> , тогда в вашем коде есть if ($_GET['action'] === 'download') , получать данные из базы данных, форматировать их, отправлять заголовки и эхо-данные. И затем die() , потому что эта часть скрипта не может справиться больше.

По сути, вы не можете вывести CSV-файл и ссылку на него за один раз. (Вам нужно ввести концепцию режима страницы и активировать режим загрузки с помощью … pagename.php? Mode = загрузить или аналогичный. Затем вы можете использовать оператор switch PHP для переключения $ _GET ['mode'] в вашем скрипте.)

Тем не менее, текст заголовка типа text / csv, который вы использовали, является правильным, хотя вы также можете выводить заголовки Content-Length и Content-Disposition. После того, как вы выведете данные файла, также обязательно прекратите любую дополнительную обработку скрипта через функцию exit PHP.

Кроме того, вероятно, будет намного меньше проблем (и, конечно же, будет быстрее / более эффективно с памятью) использовать MySQL SELECT … INTO OUTFILE (если у вас есть разрешения), а не использовать PHP для сбора данных.

Вы не должны помещать ссылку в тот же файл, который генерирует csv, поскольку ссылка не будет в самом csv!

Сделайте что-то вроде:

 <a href="fileThatGeneratesTheCSV.php">Download CSV</a> 

и он должен работать

Три вещи, которые следует учитывать:

  1. Вы отправляете заголовки, указывающие, что пользователь будет загружать CSV-файл, но затем вы отправляете ссылку для его загрузки? Это неверно, вы должны ссылаться на эту страницу, а затем выводить сами данные CSV после заголовков.

  2. MySQL имеет возможность генерировать вывод CSV, и вы должны обязательно воспользоваться этим, а не пытаться сделать это самостоятельно. Вы можете использовать SELECT INTO … OUTFILE для этого.

  3. Если вы должны создать CSV с помощью PHP, для этого используйте fputcsv . Это позволит справиться со всеми сложностями CSV, такими как экранирование и правильное форматирование. Поскольку fputcsv записывает в файл, вы можете либо записать его во временный файл, а затем вывести его после отправки заголовков или использовать следующий трюк для вывода его напрямую:

Сделайте это после отправки заголовков:

 $fp = fopen('php://output', 'w'); while( $row = mysql_fetch_row( $export ) ) { fputcsv($fp, $row); } 

Я думаю, что mySQL => CSV – общая проблема, которая является частью каждого форума PHP. Я пытаюсь решить эту проблему обычным способом и реализовать бесплатную версию lib для PHP, которая очень похожа на философию Google AppInventor. DragDrop и скрыть кодировку.

Используйте lib и создайте свой экспорт через Click & Point.

Общие демонстрации: http://www.freegroup.de/software/phpBlocks/demo.html Ссылка на редактор: http://www.freegroup.de/test/editor/editor.php?xml=demo_sql.xml

стоит посмотреть

Приветствую

Andreas