PHP: экспорт PDO + CSV не загружается (проблема с заголовками?) - PullRequest
0 голосов
/ 21 мая 2018

Мне трудно заставить мою функцию экспорта CSV работать.
Я нашел много примеров использования функций mysqli_ *, но на самом деле я использую PDO, поэтому мне пришлось адаптировать некоторые вопросы / ответы кмои потребности.
Для того, что я вижу, я правильно анализирую и записываю данные в файл * .csv, но в конце я просто не получаю модал "Download" из браузера.
СноваОглядываясь вокруг, я понял, что у меня могут быть какие-то проблемы с заголовками, поэтому я прошу вашей помощи.

Это мой фрагмент функции PHP:

function downloadAsCSV($dsn, $dbUser, $dbPsw, $options) {
    // New PDO connection.
    $pdo = pdoConnect($dsn, $dbUser, $dbPsw, $options);

    $query = ... // Not going to write it down.

    // Let's query the database, ...
    $stmt = $pdo->prepare($query);

    // Setting up the query variables here...
    [...]
    // Executing the statement...
    $stmt->execute();

    // Headers.
    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='export.csv'");
    header("Pragma: no-cache");
    header("Expires: 0");

    // Let's open tbe "*.csv" file where we'll save the results.
    $fp = fopen("php://output", "w");

    if ($fp) {
        $first_row = $stmt->fetch(PDO::FETCH_ASSOC);
        $headers = array_keys($first_row);
        fputcsv($fp, array_values($first_row));
        fputcsv($fp, $headers);

        // ... fetch the results...
        $workpiecesArray = $stmt->fetchAll();

        // ... and, finally, export them.
        foreach ($workpiecesArray as $workpiece) {
            fputcsv($fp, array_values($workpiece));
        }
    }

    fclose($fp);

    // Closing the connection.
    $stmt = null;
    $pdo = null;
}

function mysqli_field_name($result, $field_offset) {
    $properties = mysqli_fetch_field_direct($result, $field_offset);

    return is_object($properties) ? $properties->name : null;
}

Я черпал вдохновение для написания заголовков столбцов таблицы из этого ответа .

Ответы [ 2 ]

0 голосов
/ 21 мая 2018
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="export.csv"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('export.csv'));
readfile($csvFile);
exit;
`put this after` fclose($fp);
0 голосов
/ 21 мая 2018

Что вам нужно сделать, это распечатать файл, который вы сейчас не делаете.Смотрите этот пример, используя readfile: http://php.net/manual/en/function.header.php#example-5554

Проще говоря:

1.Заменить

$fp = fopen("php://output", "w");

с

$tmpfname = tempnam("/", "");
$fp = fopen($tmpfname, "w");

2.Заменить

fclose($fp);

с

fclose($fp);
readfile($tmpfname);
unlink($tmpfname);

, и это будет работать

...