Я пытаюсь написать запрос MySQLi в загружаемый CSV. Следующие заголовки открывают поток для CSV:
$fileName = ''; //empty file name, file name is cast later header("Cache=Control: must-revalidate, post-check=0, pre-check=0"); header('Content-Description: File Transfer'); header("Content-type: text/csv"); header("Content-Disposition: attachment; filename={$fileName}"); header("Expires: 0"); header("Pragma: public"); $fh = @fopen( 'php://output', 'w' );
Ниже я имею следующее, которое пытается запросить и отбросить каждую строку запроса к новой строке в файле CSV:
if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')){ $fileName .= 'OutputWeightNull.csv'; $query = mysqli_query($conn, 'SELECT * FROM `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL')or die(mysql_error()); $result = mysqli_fetch_array($query) or die(mysql_error()); $headerDisplayed = false; foreach ($result as $data){ if (!headerDisplayed){ fputcsv($fh, array_keys()); $headerDisplayed = true; } fputcsv($fh, $data); } }
CSV загружается в браузер по своему желанию, однако он выглядит пустым, результаты запроса не отправляются в CSV. Может ли кто-нибудь указать мне в правильном направлении, почему это может быть.
Это моя первая попытка скрипта PHP, более сложного, чтобы приветствовать мир. Извините, если ответы очень просты или очевидны.
Попробуйте это
if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')){ $fileName = 'OutputWeightNull.csv'; $fh = @fopen( 'php://output', 'w' ); header("Cache=Control: must-revalidate, post-check=0, pre-check=0"); header('Content-Description: File Transfer'); header("Content-type: text/csv"); header("Content-Disposition: attachment; filename={$fileName}"); header("Expires: 0"); header("Pragma: public"); $query = mysqli_query($conn, 'SELECT * FROM `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL')or die(mysql_error()); $headerDisplayed = false; while($result = mysqli_fetch_array($query, MYSQLI_ASSOC)) { if (!$headerDisplayed){ fputcsv($fh, array_keys($result)); $headerDisplayed = true; } fputcsv($fh, $result); } }
вам нужно поместить заголовок csv внутри цикла «if»
Очистка кода до касания вокруг возвращенных строк и использование функций mysqli_ error:
<?php if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')) { $fileName = ''; //empty file name, file name is cast later header("Cache=Control: must-revalidate, post-check=0, pre-check=0"); header('Content-Description: File Transfer'); header("Content-type: text/csv"); header("Content-Disposition: attachment; filename={$fileName}"); header("Expires: 0"); header("Pragma: public"); $fh = @fopen( 'php://output', 'w' ); $fileName .= 'OutputWeightNull.csv'; $query = mysqli_query($conn, 'SELECT * FROM `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL') or die(mysqli_error($conn)); if ($result = mysqli_fetch_array($query, MYSQLI_ASSOC)) { fputcsv($fh, array_keys($result)); fputcsv($fh, $result); while ($result = mysqli_fetch_array($query, MYSQLI_ASSOC)) { fputcsv($fh, $result); } } }
MySQL имеет встроенный тип запроса для вывода данных непосредственно в формат CSV.
Измените запрос SELECT
так, чтобы он был в следующем формате:
SELECT fieldlist FROM table INTO OUTFILE 'filename.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Теперь вам не придется делать какие-либо из этих циклов или что-то в этом роде; все, что нужно PHP, это запустить этот запрос, а затем выполнить readfile()
в CSV-файле, сгенерированном MySQL, и, наконец, удалить его с диска.
Это сэкономит много памяти для вашей PHP-программы, а также будет работать намного быстрее (это будет действительно примечательно, если у вас большой набор данных).