web-dev-qa-db-ja.com

CSVファイル生成の失敗

私はクライアント用のプラグインを使用しています(私はある程度修正しました)。これは組織のメンバーのデータベースを作成し、維持します(そのために新しいwpテーブルを使用します)。

Csvのインポートと挿入を実行するNice機能があります。このテーブルの内容を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);
?>

そのため、クエリが実行され、$outputfopenで確立され、viaachステートメントを介して追加され、最後にfclosedとなるルーチンがあります。

私が(サーバーから)得ているエラーは

Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found.

しかし、それは明らかに発見されつつあり、それはただ失敗しています。ファイルの先頭でphpinfo()(PHP Version 5.2.17)を有効にすると、間違いなく応答があります - 特にCannot modify header informationphpinfo()はすでにヘッダーを生成しているため)。ただし、予想されるデータはすべてページに印刷されますが、少なくともその分だけ正しく機能しています。

Fopen関数やfclose関数が適切に機能しない原因があると思いますが、問題が何であるかを正確に識別するのに十分な経験がありません。

私は、これが私のテスト環境(localhost/XAMPP、netbeans)で期待通りに動くことに再び気づくでしょう。

任意の考えは最も感謝されるでしょう。

1
Bosworth99

これを試して:

<?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としてフォーマットされ、ダウンロードが直接ブラウザに送信され、ユーザーにファイルの保存を促すダイアログが表示されます。

1
JMichael