У меня возникли проблемы с экспортом файла 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>
и он должен работать
Три вещи, которые следует учитывать:
Вы отправляете заголовки, указывающие, что пользователь будет загружать CSV-файл, но затем вы отправляете ссылку для его загрузки? Это неверно, вы должны ссылаться на эту страницу, а затем выводить сами данные CSV после заголовков.
MySQL имеет возможность генерировать вывод CSV, и вы должны обязательно воспользоваться этим, а не пытаться сделать это самостоятельно. Вы можете использовать SELECT INTO … OUTFILE для этого.
Если вы должны создать 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