使用 PHP PDO 从 PostgreSQL 表导出 .csv 文件(带标题),第一个数据行丢失

问题描述 投票:0回答:2

抱歉这个问题可能很简单,但总的来说我对 PHP 和 SQL 很陌生。

我正在尝试使用 PHP PDO 从 PostgreSQL 表导出 CSV 文件。从缺少的第一个数据行开始,一切都工作正常。

这是我的代码:

<?php

function bb()
{
$servername = "localhost";
$username = "postgres";
$password = "mypassword";
$dbname = "mydb";

$conn = new PDO("pgsql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM foundation"); 
$stmt->execute();

$filename = 'test_postgres.csv';

header('Content-type: application/csv');
header('Content-Disposition: attachment; filename=' . $filename);
header("Content-Transfer-Encoding: UTF-8");

$head = fopen($filename, 'w');

$headers = $stmt->fetch(PDO::FETCH_ASSOC);
fputcsv($head, array_keys($headers));

fclose($head);

$data = fopen($filename, 'a');

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        fputcsv($data, $row);
    }

fclose($data);
}

bb();

?>

这就是我应该拥有的:

img1

虽然这是我所看到的:

enter image description here

我认为我正在编写标题来代替第一个数据行,但我找不到避免此问题的方法。有什么想法吗?

谢谢,斯特凡诺。

php postgresql csv pdo
2个回答
3
投票

问题是,当您读取标题行时,即数据的第一行,因此您还需要将数据从这里写入数据文件...

$headers = $stmt->fetch(PDO::FETCH_ASSOC);
fputcsv($head, array_keys($headers));

fclose($head);

$data = fopen($filename, 'a');
fputcsv($data, $headers);  // This adds the data from the header row

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        fputcsv($data, $row);
    }

0
投票

您的第一行丢失了,因为您用它来获取此处的标题:

$headers = $stmt->fetch(PDO::FETCH_ASSOC);

如果您不使用令人困惑的

while
循环,而是使用简单的
foreach
,则可以避免该问题。

$head = fopen($filename, 'w');

$headers = $stmt->fetch(PDO::FETCH_ASSOC);
fputcsv($head, array_keys($headers));

foreach ($stmt as $row) {
    fputcsv($data, $row);
}
© www.soinside.com 2019 - 2024. All rights reserved.