1

我正在尝试使用 PHP 将 PostgreSQL 查询的结果输出为 CSV 格式。

主页上有一个链接,它将 SQL 语句作为字符串发送到另一个 PHP 类中的另一个函数,该函数又获取 SQL 并使用 pg_query() 执行查询并返回结果集。

我的问题是,当我打开 CSV 文件时,我的所有查询结果都在那里,但在文件末尾我看到了发送查询页面的 HTML 代码。

我查看了几个 StackOverflow 帖子,但无济于事。

这是我的代码:

主类:

$o .= '<p>You can convert the result set to CSV format to be opened in Excel.</p>';

$link = array('op1' => 'PatternExport', 'op2' => 'outputToCSV', 'id' => $pattern_id, 'data' => $pattern_SQL);

$o .= '<a href="' . $this->oQS->buildEncryptedURL($link) . '">Download Query Results as CSV File</a>';

接收等级:

function outputToCSV()
{ 
    $ptid = $this->oQS->getValue('id');
    $sql = $this->oQS->getValue('data');

    $href = $this->oQS->buildEncryptedURL(array('op1'=>'PatternManager', 'op2'=>'listPatterns'),'/aatsc/index.php');
    $result = pg_query($sql);

    // filename for download 
    $filename = "query_results_" . date('Ymd') . "_" . $ptid . ".csv"; 

    $output = fopen('php://temp/maxmemory:' . (12*1024*1024), 'rw+');
    foreach(pg_fetch_assoc($result,0) AS $field=>$value)
    {
        $output .= '' . $field . ',';
    }
    $output = rtrim($output,',') . "\n";


    for($i=0;$i<pg_num_rows($result);$i++)
    {
        foreach(pg_fetch_assoc($result,$i) AS $field=>$value) 
            $output .= '' . $value . ',';
        $output = rtrim($output,',') . "\n";
    }
    header("Content-Type: application/vnd.ms-excel;"); 
    header("Content-Disposition: attachment; filename=\"$filename\";");
    header("Pragma: no-cache");
    print($output);
    //$href = $this->oQS->buildEncryptedURL(array('op1'=>'PatternManager', 'op2'=>'listPatterns'),'/aatsc/index.php');
    //header("Location: $href");  
}

您能否告诉我是否使用正确的方法将查询结果导出到 CSV,以及我的代码中的什么导致整个 HTML 代码被流式传输?

谢谢

4

2 回答 2

1

您只需要发出SQL COPY语句,如下所示:

COPY (select * from tbl) to stdout with csv header

导致:

col1,col2,col3
2013-05-22 07:28:59.732,192.168.1.67,3
于 2013-05-23T15:16:06.027 回答
1

您生成 $output 两次,如果您删除 foreach 循环和 fopen 行,它应该可以工作。

于 2013-05-23T15:19:11.157 回答