2013-05-06 14 views
6

私は別のテーブルを持つmysqlデータベースを持っています。テーブル間のデータはリンクされており、ユーザーIDを使用してそれらを取得して表示します。私は参照を使用しましたPHP MYSQLi Displaying all tables in a databasePHPでmysqlとCSVとしてデータをエクスポート

しかし、この情報をcsvファイルとしてエクスポートするにはどうすればよいですか?エコーの代わりに文字列に変更して文字列をcsvファイルに出力しましたが、動作しません。

私はまた、からの例を試してみました: http://sudobash.net/php-export-mysql-query-to-csv-file/

しかし、私はデータを見ることができますが、上にCSVファイル内のジャンクは(のような"<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>"
など)もあります。

これを行う別の方法はありますか?あなたはCSVファイルに各MySQLの行を書きたい場合は

答えて

12

は、あなたがPHP5の機能に組み込まれて使用することができfputcsv

$result = mysqli_query($con, 'SELECT * FROM table'); 
$row = mysqli_fetch_array($result, MYSQLI_ASSOC); 

$fp = fopen('file.csv', 'w'); 

foreach ($row as $val) { 
    fputcsv($fp, $val); 
} 

fclose($fp); 
file.csvに書かれた行ごとにカンマで区切られた文字列を返す必要があり

row1 val1, row1 val2 
row2 val1, row2 val2 
etc.. 

また、書き込み先のディレクトリのアクセス許可を確認してください。

+0

dcd08 @おかげで

header('Content-type: text/csv'); header('Content-disposition: attachment;filename=MyCsvFile.csv'); echo $csvString; 

を置き換えますこれは問題ですが、csvファイルの最下部にある "

" など何が起こっているのでしょうか? – aandroidtest

+0

さて、ob_start()を先頭に置く必要があり、これが解決されました。 – aandroidtest

+0

誰でもcsv/xlsエクスポートと並んで検索ボックスのクエリを処理する方法の例/リンクを投稿できますか?検索ボックスをクエリと$ _GET ["search"]変数として使用し、mysqlからデータを取得し、テーブルに表示してからxls/csvにエクスポートしたいと考えています。私の知る限り、1つの検索ボックス入力と2つの送信ボタンがあるはずです... –

4

あなたは、MySQL INTO OUTFILE句を利用しようとすることができます:

SELECT * 
    INTO OUTFILE '/tmp/tablename.csv' 
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
     LINES TERMINATED BY '\n' 
    FROM tablename 
    WHERE userid = 1 
+0

これは本当にクールです!本当にありがとう! – nrubin29

9

これはMySQLi'sfetch_fields機能を使って、ヘッダーやフィールド名を組み込んだソリューションです -

$query = "SELECT * FROM table"; 
$result = $db->query($query); 
if (!$result) die('Couldn\'t fetch records'); 
$headers = $result->fetch_fields(); 
foreach($headers as $header) { 
    $head[] = $header->name; 
} 
$fp = fopen('php://output', 'w'); 

if ($fp && $result) { 
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="export.csv"'); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    fputcsv($fp, array_values($head)); 
    while ($row = $result->fetch_array(MYSQLI_NUM)) { 
     fputcsv($fp, array_values($row)); 
    } 
    die; 
} 

また、これは修正されof a different answerそこでは同様の解決策が提案されましたが、ヘッダーの部分は私のためには機能しませんでしたので、私はそれらを取得する方法を変更しました。クレジットは@Jrgnsのためです

+0

私のためにうまくいった...ありがとう! – user2662680

1

(オブジェクト指向を使用して)mysqliクエリからcsvファイルを作成してダウンロードするにはこれが役立つと思います。

これはデータベースに接続するクラスで、mysqliとPHPを使用して必要な機能をすべて実行します。この場合、このクラス(requireまたはinclude)を呼び出すには、単に "downloadCsv()"関数を使用します。

例として、これは「Class.phpと」ファイルのようになります「download.php」ファイルにその関数を使用し、この例では、「Class.phpと」ファイルを作成した後

<?php 
class DB{ 

private $con; 

//this constructor connects with the database 
public function __construct(){ 
$this->con = new mysqli("Your_Host","Your_User","Your_Pass","Your_DatabaseName"); 

if($this->con->connect_errno > 0){ 
    die('There was a problem [' . $con->connect_error . ']'); 
    } 
} 

//create the function that will download a csv file from a mysqli query 

public function downloadCsv(){ 

$count = 0; 
$header = ""; 
$data = ""; 
//query 
$result = $this->con->query("SELECT * FROM Your_TableName"); 
//count fields 
$count = $result->field_count; 
//columns names 
$names = $result->fetch_fields(); 
//put column names into header 
foreach($names as $value) { 
    $header .= $value->name.";"; 
    } 
} 
//put rows from your query 
while($row = $result->fetch_row()) { 
    $line = ''; 
    foreach($row as $value)  { 
     if(!isset($value) || $value == "") { 
      $value = ";"; //in this case, ";" separates columns 
    } else { 
      $value = str_replace('"', '""', $value); 
      $value = '"' . $value . '"' . ";"; //if you change the separator before, change this ";" too 
     } 
     $line .= $value; 
    } //end foreach 
    $data .= trim($line)."\n"; 
} //end while 
//avoiding problems with data that includes "\r" 
$data = str_replace("\r", "", $data); 
//if empty query 
if ($data == "") { 
    $data = "\nno matching records found\n"; 
} 
$count = $result->field_count; 

//Download csv file 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=FILENAME.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
echo $header."\n".$data."\n"; 

} 
?> 

<?php 
//call the "class.php" file 
require_once 'class.php'; 
//instantiate DB class 
$export = new DB(); 
//call function 
$export->downloadCsv(); 
?> 

ダウンロード後、ファイルをMS Excelで開きます。

私はこれをうまく書いたと思いますが、私はテキストとコードフィールドに慣れていませんでした。

1

これを試してください。

function addRowToCsv(& $csvString, $cols) { 
    $csvString .= implode(',', $cols) . PHP_EOL; //Edits must be 6 characters - all I added was a "." before the =. :-) 
} 

$csvString = ''; 
$first = true; 

while ($row = mysqli_fetch_assoc($query)) { 
    if ($first === true) { 
     $first = false; 
     addRowToCsv($csvString, array_keys($row)); 
    } 
    addRowToCsv($csvString, $row); 
} 

header('Content-type: text/csv'); 
header('Content-disposition: attachment;filename=MyCsvFile.csv'); 

echo $csvString; 

addRowToCsvの最初の引数は、参照渡しであることに注意してください。これは必須ではなく、戻り値を簡単に使うこともできますが、これは私がやる方法です。

あなたがダウンロードとしてそれを提供する出力をファイルに保存ではなく、したい場合は、上記を使用しますが、私は実際に試してみました。..

file_put_contents('MyCsvFile.csv', $csvString); 
関連する問題