2011-01-05 2 views
0

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

Код, который я использую, печатает правильные данные, но я не вижу, как загрузить эти данные в файле 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"; 

ответ

0

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

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

+0

Большое спасибо за помощь каждого - очень ценю. – ss888

0

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

ли что-то вроде:

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

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

+0

И затем использовать правильный тип контента: применение/vnd.ms-первенствует с .xls. –

+0

@ The Andrew Sledge: Почему вы используете такой тип контента? Что произойдет, если я не установил Office? 'text/csv' - это то, что он должен использовать. – nico

+0

Я думаю, что Эндрю Сандж говорил, что для прокомментированной строки о файлах xls используйте правильный тип. – Andrew

1

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

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

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

0

Три вещи, чтобы рассмотреть следующие вопросы:

  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); 
} 
0

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

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

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

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

Приветствия

Andreas