Этот фрагмент кода РЕАЛЬНО решает мою проблему, сохраняя запрос на .csv
через php
- однако я не могу понять, почему, когда он предлагает мне сохранить как export.csv
, этот файл открывается пустым, в то время как file.csv
сохраняет отлично в одно и то же время с данными, которые мне нужны. Я уверен, что что-то очевидное происходит с заголовками. Может ли кто-нибудь помочь?
*** РЕДАКТИРОВАТЬ ниже предложения привел меня к этому состоянию, и он больше не сохраняет файл и запрашивает пустой, но теперь корректный файл показывает с ним хард HTML. В этом скрипте нет другого HTML - я пробовал предложения из многих других сообщений. Как я могу решить?
$query = "SELECT * from Table";
$result = mysqli_query($connS, $query);
$headers = $result->fetch_fields();
foreach($headers as $header) {
$head[] = $header->name;
}
$fp = fopen('php://output', 'w');
header('Content-Disposition: attachment; filename="export.csv"');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
fputcsv($fp, array_values($head));
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
$fp = fopen('file.csv', 'w');
readfile($fp);
fclose($fp);
end();
В настоящее время вы сохраняете содержимое только в файле, а не отправляете его в браузер пользователя. Возможно, попробуйте добавить вызов readfile
перед выражением die
.
Таким образом, ваши последние строки будут выглядеть так:
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
readfile($fp);
die;
}
Readfile читает файл и записывает его в выходной буфер. Вы можете найти более подробную информацию о readfile
функции здесь.
Обратите внимание, что способ, которым вы в данный момент выполняете это (сохранение файла до того, как пользователь может загрузить), если два пользователя нажимают на эту страницу одновременно, они, вероятно, будут топать на пальцах друг друга (и создать нечетное смешение двух созданных CSV), Вы можете попытаться просто вывести содержимое CSV непосредственно в браузер пользователя, используя код в принятом ответе. Если вы сделаете это после своих заголовков, это приведет к тому, что браузер обработает его как файл, который будет загружен.