mysqlでテキスト(タブ区切り)を生成する方法


phpとmysql5.1.22を利用しています。これを用いて、mysql_fetch_arrayで取り出したデータをテキスト(タブ区切り)で生成して、ダウンロードさせるにはどうしたら良いでしょうか?

今、単純に、フィールド名とデータが
index data
1 sample1
2 sample2
で、これを
インデックス データ
1 sample1
2 sample2
という風にsamples.txtで出力したいと思っています。

イメージとしては、ダウンロードボタンを押せばsamples.txtを名前をつけて保存するようにコマンドボックスが出る感じです。
もしくは、生成したデータのダウンロードへのハイパーリンクをテキストで表示させても良いです(これはファイルが生成された後、その存在を調べて表示しないといけないので大変そうですが)。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/03/25 20:56:50
  • 終了:2011/03/30 12:47:32

ベストアンサー

id:deflation No.1

deflation回答回数1036ベストアンサー獲得回数1262011/03/25 22:33:12

ポイント60pt

以下のパラメータとします。

DBホスト名 localhost
DBユーザー名 user_hoge
DBパスワード psw_hoge
テーブル名 TABLE

プログラムは以下のようになります。

<?php
$outstr = '';
$link = mysql_connect('localhost', 'user_hoge', 'psw_hoge');
$sql = 'select * from TABLE where 1;';
$res = mysql_query($sql, $link);
while ($row = mysql_fetch_array($res)) {
    $outstr .= sprintf("%s\t%s\n", $row['index'], $row['data']);
}
mysql_close($link);
header('Content-Type: text/plain'); 
header('Content-Disposition: attachment; filename="samples.txt"'); 
header('Content-Length: '. strlen($outstr));
echo $outstr;
?>
id:ReoReo7

ありがとうございます!

全く知らないコマンドだらけですが・・・

$outstrに格納して、それを出力しているのですね。

冒頭に

インデックス\tデータ\n

というカラム名は最初の1行に出力されるのでしょうか?

(あっ、それはもう最初に

$outstr .= sprintf("%s\t%s\n", 'インデックス', 'データ');

とすれば良いのか。)

ありがとうございました。

クライアント側で処理させたい動作がありましたので、助かりました。

追伸:ダウンロードの指示が出るのでしょうか。今手元に環境が無いので、明日試してみます!

追伸2:3/26、php中のif($result)の直後に上記スクリプトを組み込んでみました:

if($result){

$outstr = '';

while ($row = mysql_fetch_array($result)) {

$outstr .= sprintf("%s\t%s\n", $row['index'], $row['data']);

}

header('Content-Type: text/plain');

header('Content-Disposition: attachment; filename="samples.txt"');

header('Content-Length: '. strlen($outstr));

echo $outstr;

すると、このphpを実行した瞬間、samples.txtのダウンロードが始まり、それをメモ帳で開くと、全ての表示される予定だったHTMLが表示されました。

$outstr .= sprintf("%s\t%s\n", $row['index'], $row['data']);

の部分だけを表示させることはできないでしょうか?

素人で隅から隅まで指示しないとできず申し訳ありませんが、よろしくお願いします。

2011/03/26 22:11:59

その他の回答(2件)

id:deflation No.1

deflation回答回数1036ベストアンサー獲得回数1262011/03/25 22:33:12ここでベストアンサー

ポイント60pt

以下のパラメータとします。

DBホスト名 localhost
DBユーザー名 user_hoge
DBパスワード psw_hoge
テーブル名 TABLE

プログラムは以下のようになります。

<?php
$outstr = '';
$link = mysql_connect('localhost', 'user_hoge', 'psw_hoge');
$sql = 'select * from TABLE where 1;';
$res = mysql_query($sql, $link);
while ($row = mysql_fetch_array($res)) {
    $outstr .= sprintf("%s\t%s\n", $row['index'], $row['data']);
}
mysql_close($link);
header('Content-Type: text/plain'); 
header('Content-Disposition: attachment; filename="samples.txt"'); 
header('Content-Length: '. strlen($outstr));
echo $outstr;
?>
id:ReoReo7

ありがとうございます!

全く知らないコマンドだらけですが・・・

$outstrに格納して、それを出力しているのですね。

冒頭に

インデックス\tデータ\n

というカラム名は最初の1行に出力されるのでしょうか?

(あっ、それはもう最初に

$outstr .= sprintf("%s\t%s\n", 'インデックス', 'データ');

とすれば良いのか。)

ありがとうございました。

クライアント側で処理させたい動作がありましたので、助かりました。

追伸:ダウンロードの指示が出るのでしょうか。今手元に環境が無いので、明日試してみます!

追伸2:3/26、php中のif($result)の直後に上記スクリプトを組み込んでみました:

if($result){

$outstr = '';

while ($row = mysql_fetch_array($result)) {

$outstr .= sprintf("%s\t%s\n", $row['index'], $row['data']);

}

header('Content-Type: text/plain');

header('Content-Disposition: attachment; filename="samples.txt"');

header('Content-Length: '. strlen($outstr));

echo $outstr;

すると、このphpを実行した瞬間、samples.txtのダウンロードが始まり、それをメモ帳で開くと、全ての表示される予定だったHTMLが表示されました。

$outstr .= sprintf("%s\t%s\n", $row['index'], $row['data']);

の部分だけを表示させることはできないでしょうか?

素人で隅から隅まで指示しないとできず申し訳ありませんが、よろしくお願いします。

2011/03/26 22:11:59
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542011/03/26 00:23:42

ポイント45pt

MySQLのSELECT文で、INTO OUTFILE句を使えば、カンマ区切りやタブ区切りでテキストファイルに出力できますから、参考まで。


SELECT文のINTO OUTFILE句のマニュアル記載

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7 SELECT 構文


区切りなどのオプション(LOAD DATA INFILE文)のマニュアル記載

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.5 LOAD DATA INFILE 構文

id:ReoReo7

ご連絡ありがとうございます。

2つ目のページを一通り読みましたが、20%程度しか理解できませんでした。

1つ目のページの該当箇所は30%くらい分かったと思います。

INTO OUTFILE を利用する事はできません。その場合、クライアント ホスト上にファイルを生成する為には、代わりに mysql -e "SELECT ..." > file_name のようなコマンドを利用しなければいけません。

あたりが関係していることが分かりました。

サンプルが無いとphpにどう落とし込んでよいのか分かりかねますので、サンプルを探してみます。

あれば回答くださると嬉しいです。

2011/03/26 22:17:36
id:taroe No.3

taroe回答回数1099ベストアンサー獲得回数1322011/03/27 23:17:19

ポイント30pt

http://ma-bank.com/item/602

CSVファイルですが考えかたは同じなので参考に

id:ReoReo7

ありがとうございます。CSVですがテキストに応用することを考えてみようと思います。

2011/03/28 16:50:03
  • id:ReoReo7
    すばらしい意見を下さりありがとうございました。
    実装したという報告ができずに申し訳ありません。
    その後も役に立つ知識ときっかけでしたので、今後も精進したいと思います。

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません