【问题标题】:Export .csv file (with headers) from PostgreSQL table using PHP PDO, first data row missing使用 PHP PDO 从 PostgreSQL 表中导出 .csv 文件(带标题),缺少第一个数据行
【发布时间】:2018-04-04 13:54:28
【问题描述】:

抱歉,这个问题可能很简单,但我对 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();

?>

这是我应该拥有的:

虽然这是我能看到的:

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

谢谢,斯特凡诺。

【问题讨论】:

标签: php postgresql


【解决方案1】:

问题是当你读取表头的行时,也就是数据的第一行,所以你还需要将这里的数据写入数据文件中……

$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);
    }

【讨论】:

  • 对。另外,我认为没有必要关闭文件并使用'a' 重新打开它。没有?
  • 除非有充分的理由关闭文件,否则只需打开一次并写入即可。
  • 太好了,现在完美运行,谢谢。只是为了好奇,你能解释一下array_keys($headers)在这里的作用是什么,如果我们有fputcsv($data, $headers)
  • 当你使用FETCH_ASSOC时,这意味着数据以SQL中的字段名(在这种情况下实际上是列名)作为键(见stackoverflow.com/questions/16846531/…),所以array_keys()给出构成标题的所有字段的列名数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2014-09-26
  • 2019-07-27
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多