PHP: написание MYSQL-запроса в CSV

Я пытаюсь написать запрос 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-скрипт более сложным, чем привет. Извиняюсь, если ответы очень простые или очевидные.

4

Решение

Попробуй вот так

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

1

Другие решения

Очистка кода на ощупь, чтобы обойти возвращаемые строки и использовать функции ошибки mysqli_:

<?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);
}
}
}
3

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, а также будет работать намного быстрее (это будет действительно заметно, если у вас большой набор данных).

2
По вопросам рекламы [email protected]