2016-03-23 24 views
0

mySQLデータベースからデータを取得し、作成後に自動的にダウンロードする必要があるCSVファイルにエクスポートするためのPHPコードがあります。fputcsvファイルを作成しますが、空のファイルをダウンロードします

  • は、データを取得します:

    $connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection)); 
    
    // fetch mysql table rows 
    $sql = "select * from users"; 
    $result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection)); 
    
    $fp = fopen('users.csv', 'w'); 
    
    while($row = mysqli_fetch_assoc($result)) { 
        fputcsv($fp, $row); 
    } 
    
    fclose($fp); 
    
    header('Content-Type: text/csv'); 
    
    header('Content-Disposition: attachment; filename="users.csv"'); 
    
    mysqli_close($connection); 
    

    ここでの問題はそれということです。

  • export.phpファイルと同じディレクトリにあるサーバー上のCSVファイルを取得し、そのデータはです。
  • は、同じ名前を持つファイルをダウンロードしますが、それはEMPTY

おかげです。

+1

はこれを試してみてください。 'readfile( 'users.csv')'のようなものが必要です。ファイルをディスクから読み取ってクライアントに吐き出します。 –

+0

ファイルの内容のみを出力するファイルの内容は出力されず、ファイル名はCSVです。 – chris85

+0

サーバ上の物理ファイルに書き込むのではなく(同時ユーザがいる場合は問題があります)、ファイル名として '' php:// output''を使用してください(ファイルを開く前にヘッダーを送信してください)。すべてのサーバーディスクを使用せずにブラウザ –

答えて

0

あなたはusers.csvというファイルに書き込みますが、強制的にダウンロードするファイルはページの出力です。

質問が正しい限り、PHPスクリプトが実行されると、users.csvというファイルが、正しいデータを含むPHPファイルと同じディレクトリに存在する必要があります。

あなたがダウンロードしているファイルのものであるためには、ブラウザにデータを出力する必要があります。あなたは、ファイルを出力する気にしません

//Connect to database 
$connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection)); 

//Fetch mysql table rows 
$sql = "select * from users"; 
$result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection)); 

//Close connection 
mysqli_close($connection); 

//Set $output 
$output = ""; 

//Set header values 
$headers = array("Header 1", "Header 2", "Header 3"); 

//Insert header values to $output 
foreach($headers as $h){ 
    $output .= fieldCheck($h) . ","; 
} 
$output = rtrim($output, ","). "\n"; 

//Iterate through results 
while($row = mysqli_fetch_assoc($result)) { 
    foreach($row as $cell){ 
     //Comma-separate each value 
     $output .= fieldCheck($cell).","; 
    } 
    //Remove last comma of each line and add newline 
    $output = rtrim($output, ",") . "\n"; 
} 

//Set headers 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename="users.csv"'); 

//Output 
echo $output; 

exit; 

//Function in case of comma in field 
function fieldCheck($string){ 
    if(strpos($string, ",") !== false){ 
     $string = '"'.$string.'"'; 
    } 
    return $string; 
} 
+0

これは、セパレータを除いて完璧に動作し、使用する方法がある ";" "、" の代わりに、列のカスタムヘッダーを追加する方法はありますか? $ output = ""の直後に列の名前を追加したときと同じです。エクセルはファイルフォーマットがエクステンションと異なるが、とにかく開くことを教えてくれます。 –

+0

さて、CSVは「カンマ区切り値」の略語なので、セミコロンの ';'やタブを使用すると、CSVで開くことができなくなります。フィールドにカンマがある場合、フィールドを引用符で囲む関数を作成します。これを私の答えに追加しました。私はまた私の答えにヘッダーフィールドを追加しました。 – Ben

+0

このタイプは拡張機能で指定されているタイプとは異なると常に言います。それもSYLK形式だと言いますが、エラーが出る可能性があります(私のMS EXCELはフランス語です) –

関連する問題