PHP fopen содержит нежелательный контент - PullRequest
0 голосов
/ 08 марта 2012

Конечно, после нескольких часов размышлений над этой проблемой, первый комментарий на мой вопрос побудил меня немедленно ее решить.

Проблема заключалась в том, что, хотя я включал этот код в его собственную функцию в верхней частистраницу, я вызывал ее, только если в массиве $ _POST был установлен определенный флаг.Я не проверял флаг до конца файла PHP.Я перенес эту проверку перед функцией, и она сработала.

Оригинальный вопрос ниже:


Я пытаюсь использовать функцию fopen () в PHP для вывода CSVфайл, и хотя он содержит данные, которые я хочу, он также содержит всю структуру HTML страницы, а также встроенные таблицы стилей до содержимого, которое я на самом деле хочу вывести.

Я использую этот код(с здесь ) практически без изменений.Я очень незнаком с потоковой передачей и выводом PHP, поэтому я начал с того, что, как я надеюсь, было прочной основой:

$fileName = 'somefile.csv';

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' );

global $wpdb;
$query = "SELECT * FROM `{$wpdb->prefix}my_table`";
$results = $wpdb->get_results( $query, ARRAY_A );

$headerDisplayed = false;

foreach ( $results as $data ) {
    // Add a header row if it hasn't been added yet
    if ( !$headerDisplayed ) {
        // Use the keys from $data as the titles
        fputcsv($fh, array_keys($data));
        $headerDisplayed = true;
    }

    // Put the data into the stream
    fputcsv($fh, $data);
}
// Close the file
fclose($fh);
// Make sure nothing else is sent, our file is done
exit;

Я предполагаю, что этот пример должен был быть включен в свой собственный внешний файл PHP,но из-за ограничений, с которыми я имею дело, я пытаюсь включить это вместо этого.Я немного поработал с буферизацией вывода без каких-либо положительных результатов, но документация по PHP на них довольно скудная, так что, возможно, мне чего-то не хватает.

Ответы [ 3 ]

0 голосов
/ 08 марта 2012

Вы на правильном пути, объяснив, почему вы получаете все остальное перед данными.

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

0 голосов
/ 10 марта 2012

Конечно, после нескольких часов размышлений над этой проблемой, первый комментарий к моему вопросу заставил меня немедленно ее решить.

Проблема заключалась в том, что, хотя я включал этот код в свою собственную функцию в верхней части страницы, я вызывал его, только если в массиве $ _POST был установлен определенный флаг. Я не проверял флаг до конца файла PHP. Я перенес эту проверку перед функцией, и она сработала.

0 голосов
/ 08 марта 2012

Проблема, похоже, заключается в том, что в то же время вы пытаетесь вывести из того же PHP-файла, CSV-файл И некоторый HTML-контент. Вы должны разделить их, чтобы иметь 2 разных URL.

Полагаю, ваш PHP-код окружен HTML-кодом (и встроенным CSS), о котором вы говорите.

Что вам нужно сделать, это:

  • имеет PHP-скрипт, который выводит только CSV-контент (который содержит только код, который вы нам показали, с открывающим тегом php, конечно)

  • имеет другой скрипт PHP, который генерирует HTML-код и предоставляет ссылку на предыдущий скрипт (например).

...