代码之家  ›  专栏  ›  技术社区  ›  Davide3i

php:pdo+csv导出未下载(标题问题?)

  •  1
  • Davide3i  · 技术社区  · 6 年前

    我很难让我的csv导出功能工作。
    我已经找到了很多使用mysqli_u*函数的例子,但实际上我使用的是PDO,所以我必须根据需要调整一些问题/答案。
    对于我所看到的,我正在正确地解析数据并将其写入到*.csv文件中,但最后我不会简单地从浏览器中获得任何“下载”模式。
    再次,环顾四周,我知道我的头可能有点问题,所以我需要你的帮助。

    这是我的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;
    }
    

    我从中得到灵感,写下了表列的标题。 this answer .

    2 回复  |  直到 5 年前
        1
  •  2
  •   Jan Myszkier    6 年前

    你需要做的是打印文件,而你现在没有做。 使用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);
    

    这样就行了

        2
  •  1
  •   Azhar    6 年前
    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);