私はクライアント用のプラグインを使用しています(私はある程度修正しました)。これは組織のメンバーのデータベースを作成し、維持します(そのために新しい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);
?>
そのため、クエリが実行され、$output
がfopen
で確立され、viaachステートメントを介して追加され、最後にfclose
dとなるルーチンがあります。
私が(サーバーから)得ているエラーは
Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found.
しかし、それは明らかに発見されつつあり、それはただ失敗しています。ファイルの先頭でphpinfo()
(PHP Version 5.2.17)を有効にすると、間違いなく応答があります - 特にCannot modify header information
(phpinfo()
はすでにヘッダーを生成しているため)。ただし、予想されるデータはすべてページに印刷されますが、少なくともその分だけ正しく機能しています。
Fopen関数やfclose関数が適切に機能しない原因があると思いますが、問題が何であるかを正確に識別するのに十分な経験がありません。
私は、これが私のテスト環境(localhost/XAMPP、netbeans)で期待通りに動くことに再び気づくでしょう。
任意の考えは最も感謝されるでしょう。
これを試して:
<?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としてフォーマットされ、ダウンロードが直接ブラウザに送信され、ユーザーにファイルの保存を促すダイアログが表示されます。