CSV file generation failing

时间:2011-07-22 作者:Bosworth99

我正在为客户机使用一个插件(我对其进行了一定程度的修改),该插件创建并维护一个组织成员数据库(使用一个新的wp表)。

有一个很好的功能可以进行csv导入和插入,效果很好。还有一个功能可以将此表的内容下载为csv,该功能在我的本地系统上运行良好,但在服务器上运行时失败。坦率地说,我不知道为什么。

包含逻辑的php文件仅链接到。文件:

<?php
    //include some files
    include(\'../../../wp-blog-header.php\');

    //DIAG: phpinfo();   

    function fputcsv4($fh, $arr) {
        $csv = "";
        while (list($key, $val) = each($arr)) {
            $val = str_replace(\'"\', \'""\', $val);
            $csv .= \'"\'.$val.\'",\';
        }
        $csv = substr($csv, 0, -1);
        $csv .= "\\n";
        if (!@fwrite($fh, $csv)) 
            return FALSE;
    }

    //get member info and column data
    $table_name = $wpdb->prefix . "member_db";
    $year = date (\'Y\');
    $members = $wpdb->get_results("SELECT * FROM ".$table_name, ARRAY_A);
    $columns = $wpdb->get_results("SHOW COLUMNS FROM ".$table_name, ARRAY_A);
    //DIAG: echo \'SQL: \'.$sql.\', RESULT: \'.$result.\'<br>\';

    //output headers
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\\"members.csv\\"");

    //open output stream
    $output = fopen("php://output",\'w\'); 

    //output column headings
    $data[0] = "ID";
    $i = 1;
    foreach ($columns as $column){
        //DIAG: echo \'<pre>\'; print_r($column); echo \'</pre>\';
        $field_name = \'\';
        $words = explode("_", $column[\'Field\']);
        foreach ($words as $word) $field_name .= $word.\' \';
        if ( $column[\'Field\'] != \'id\' && $column[\'Field\'] != \'date_updated\' ) {
            $data[$i] = ucwords($field_name);
            $i++;
        }
    }
    $data[$i] = "Date Updated";
    fputcsv4($output, $data);

    //output data
    foreach ($members as $member){
        //DIAG: echo \'<pre>\'; print_r($member); echo \'</pre>\';
        $data[0] = $member[\'id\'];
        $i = 1;
        foreach ($columns as $column){
            //DIAG: echo \'<pre>\'; print_r($column); echo \'</pre>\';
            if ( $column[\'Field\'] != \'id\' && $column[\'Field\'] != \'date_updated\' ) {
                $data[$i] = $member[$column[\'Field\']];
                $i++;
            }
        }
        $data[$i] = $member[\'date_updated\'];
        //echo \'<pre>\'; print_r($data); echo \'</pre>\';
        fputcsv4($output, $data); 
    }
    fclose($output);
?>
因此,我们有一个例程,其中运行一个查询,$output 与建立fopen, 添加到via foreach语句中fcloseD

我(从服务器)得到的错误是

Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found.
但它显然正在被发现,只是失败了。如果我启用phpinfo() (PHP版本5.2.17)在文件的顶部,我肯定会得到一个响应,尤其是Cannot modify header information (因为phpinfo() 已生成标头)。然而,所有预期的数据都会打印到页面上,因此至少有很多数据工作正常。

我猜是有什么东西阻止了fopen、fclose函数正常工作,但我没有足够的经验来确定到底是什么问题。

我将再次注意到,这与我的测试环境(localhost/XAMPP、netbeans)中的预期完全一样。

任何想法都将不胜感激。

1 个回复
SO网友:JMichael

尝试以下操作:

<?php
   header("Content-type: application/csv");
   header(\'Content-Disposition: inline; filename="export.csv"\'); // change this filename
   include (\'../../../wp-load.php\'); // may need to change number of "../" depending upon location
   global $wpdb;
   $rows = $wpdb->get_results ("SELECT * FROM {$wpdb->prefix}table_name"); // change the table name
   echo strtolower(implode(\',\', array_keys((array)$rows[0]))) . "\\r\\n"; // fixes an Excel bug if the first column is "ID"
   foreach($rows as $row) echo \'"\' . implode (\'","\', array_values((array)$row)) . \'"\' . "\\r\\n";
?>
这将自动将表格的全部内容格式化为CSV,并将下载直接流式传输到浏览器,从而引发一个对话框,提示用户保存文件。

结束

相关推荐

Sort plugins by rating

当我想安装一个新的Wordpress插件时,我会搜索我想要的插件,并收到一个结果列表。有没有办法按评级或名称对结果进行排序?如果没有,它将是Wordpress的一个有用的补充。