Обратите внимание на использование косой черты SELECT INTO OUTFILEдаже в Windows.
Johan
1
Привет, это отлично работает для формата xls, но если я попытаюсь сохранить как файл CSV, он покажет все результаты в 1 столбце. Я хочу сохранить это как файл csv.
vinod reddy
Какой из вышеперечисленных лучше, безопаснее и почему?
Chella
1
Я бы склонен предположить, что второй вариант более безопасен, так как `SELECT INTO OUTFILE требует, чтобы пользователь mysql имел доступ к файловой системе для изменения файлов, что представляет собой потенциально большой риск.
Jeepstone
91
Ознакомьтесь с этим вопросом / ответом . Он более лаконичен, чем @ Geoff, а также использует встроенную функцию fputcsv.
На случай, если кто-то еще такой же глупый, как я, не заменяйте php://outputего фактическим именем файла и не пытайтесь закрыть его с помощью fcloseсимвола в конце: это не настоящий файл, а просто псевдоним для выходного потока. В любом случае, этот ответ отлично сработал для меня, спасибо Jrgns!
Для современного MySQL вы можете использовать: $ headers [] = mysqli_fetch_field_direct ($ result, $ i) -> name;
Бен из Калифорнии,
И измените другие функции mysql_ на функции mysqli_.
Бен из Калифорнии,
6
Если вы хотите, чтобы загрузка предлагалась как загрузка, которую можно было открыть непосредственно в Excel, это может сработать для вас: (скопировано из моего старого невыпущенного проекта)
Эти функции настраивают заголовки:
function setExcelContentType(){if(headers_sent())returnfalse;
header('Content-type: application/vnd.ms-excel');returntrue;}function setDownloadAsHeader($filename){if(headers_sent())returnfalse;
header('Content-disposition: attachment; filename='. $filename);returntrue;}
Он отправляет CSV в поток, используя результат mysql
Спасибо, Джон, очень полезный код. Пришлось модифицировать строку для функции csvFromResult. вместо while ($ row = mysql_fetch_row ($ result)) {fputcsv ($ stream, $ row); $ строки ++; }, мне пришлось использовать while ($ row = mysql_fetch_row ($ result)) {$ data [] = $ row; // fputcsv ($ stream, $ row); // $ rows ++; } foreach ($ data as $ d) {fputcsv ($ stream, $ d); }. еще раз спасибо за такой замечательный код.
codingbbq
3
// Export to CSVif($_GET['action']=='export'){
$rsSearchResults = mysql_query($sql, $db)ordie(mysql_error());
$out ='';
$fields = mysql_list_fields('database','table',$db);
$columns = mysql_num_fields($fields);// Put the name of all fieldsfor($i =0; $i < $columns; $i++){
$l=mysql_field_name($fields, $i);
$out .='"'.$l.'",';}
$out .="\n";// Add all values in the tablewhile($l = mysql_fetch_array($rsSearchResults)){for($i =0; $i < $columns; $i++){
$out .='"'.$l["$i"].'",';}
$out .="\n";}// Output to browser with appropriate mime type, you choose ;)
header("Content-type: text/x-csv");//header("Content-type: text/csv");//header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=search_results.csv");
echo $out;exit;}
Ответы:
( документация для этого находится здесь: http://dev.mysql.com/doc/refman/5.0/en/select.html )
или:
источник
SELECT INTO OUTFILE
даже в Windows.Ознакомьтесь с этим вопросом / ответом . Он более лаконичен, чем @ Geoff, а также использует встроенную функцию fputcsv.
источник
php://output
его фактическим именем файла и не пытайтесь закрыть его с помощьюfclose
символа в конце: это не настоящий файл, а просто псевдоним для выходного потока. В любом случае, этот ответ отлично сработал для меня, спасибо Jrgns!Посмотрите документацию по синтаксису SELECT ... INTO OUTFILE.
источник
Обновление решения @jrgns (с небольшими различиями в синтаксисе).
источник
Если вы хотите, чтобы загрузка предлагалась как загрузка, которую можно было открыть непосредственно в Excel, это может сработать для вас: (скопировано из моего старого невыпущенного проекта)
Эти функции настраивают заголовки:
Он отправляет CSV в поток, используя результат mysql
Он использует указанную выше функцию для записи CSV в файл, заданный $ filename
И здесь происходит волшебство;)
Например:
источник
источник