PHPを使用しています。

管理画面で検索結果を「ダウンロード」ボタン押下で
CSV出力させたいのですが、
一度表示させた「検索結果」のみを後からCSV出力させるロジックが不明で困っております。

例えば、ボタン押下で入力フォームの内容でもう一度DBを検索させる? などが
考えられるのですが・・・

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>検索されるの度にファイルだけは作成しておく


>ということでしょうか?

まぁ好きなようにしてくださいとしか言いようがないですが
私の触る機会があるシステムでは大きく2つロジックの違うものがあります

(1)都度作成
ダウンロードボタンおす→検索する→結果をダイレクトにテキスト出力する
これが前回提示した方法

メリットとしては、必要なデータが最短時間で入手できること
デメリットは重い処理になると同期処理なのでタイムアウトしてしまうこと

(2)作成依頼してゲット
作成ボタンをおす→作成されたデータが一定時間プールされる→ダウンロード
ボタンをおす→データがダウンロード&ダウンロードされたフラグを付ける
→一定時間が経過したら削除

メリットは非同期処理のためとりあえず放置しておけること、データの再取得にも
むだなSQLを走らせる必要がありません
デメリットは運用方法によってはプールしておくデータが放置されっぱなしになる
可能性が高いこと

業務で使うなら(2)の方がいいでしょうけど、私が個人で作るときは手っ取り早い
(1)を使うケースの方が圧倒的におおいです

この回答への補足

ご回答ありがとうございます。

>ダウンロードボタンおす→検索する→結果をダイレクトにテキスト出力する
これをやりたいのですが、そもそも
「検索する」のときに検索条件をどう設定するのか?
で困ってます。

ソースの構成は下記です。
---------------------------
・コントローラのPHP
 --検索ボタン押下時の処理
-> 検索用入力フォームVIEWで検索条件を入力
-> 検索結果表示用VIEWで結果表示

 --CSV出力押下時の処理
---------------------------

最初にフォームに値を入力して検索し、結果を得ても
CSV押下時には、フォームに入れた項目は、
検索条件に設定できないのではないかと。。

補足日時:2011/04/20 16:29
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
サーバに検索結果をファイルで持たせるように致します。

お礼日時:2011/04/22 16:49

方法1


 ・検索結果をHTML表示するときに、テンポラリディレクトリにCSVをユニークなファイル名.csvで作る
  そのHTML中にテンポラリディレクトリの.csvファイルのリンクを設置しておく
 ・テンポラリのCSVファイルは別プロセスで掃除する
   (cronまたはCSV生成時用PHP内で、1時間以上経過したファイルを探して消す等)

方法2
 ・検索結果のHTML中にCSVのダウンロードボタンを設置し、そのformにhiddenで検索条件を埋めておく
 ・CVSダウンロードのPHPでは、再度検索し(この時点ではヘッダはまだ出さない)、
  成功すれば、CSV用のヘッダとCSV形式のデータを送出。
  検索失敗時は、HTML用のヘッダとエラーメッセージのHTMLを送出

ですかね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
サーバに検索結果をファイルで持たせるように致します。

お礼日時:2011/04/22 16:49

>もう一度DBを検索させる? 



「もう一度」の前段階になにをやっているのかがわかりません。
一度画面上にCSVで出力するのに過不足ないデータを表示するということですか?
SQLの場合、キャッシュも期待できるので、一度検索した内容であれば
再検索しても相応のスピードが期待できますね。

ロジックはたんじゅんに以下の流れになるでしょう。

(1)ボタンを押したという情報を得る(ボタンにnameをつけておくなど)→
(2)データ検索する→
(3)ヘッダを吐く→
(4)データを吐く

この回答への補足

(4)データを吐く
=>この時点で、実際に「ダウンロード」ボタン押下されるかは
分からないのですが、検索されるの度にファイルだけは作成しておく
ということでしょうか?

検索=>ファイルはとりあえず作成=>「ダウンロード」ボタン押下しない場合もある

補足日時:2011/04/19 16:11
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Q複数の条件での絞り込み検索の仕方

PostgreSQLで複数の条件での絞り込み検索をしたいのです。

テーブルには
発売日、商品名、入荷日
があります。
例えば
発売日が2007年5月1日から5月5日で、商品名に「○○」もしくは「××」もしくは「△△」が含まれており、入荷日が一番新しいもの
という条件で検索したいのです。

発売日だけの絞込みならBetweenですし、商品名だけならor、入荷日の最新だったらmaxを使えば個別には検索できるのですが、これをまとめて一行でやるにはどうしたらよいのかわかりません。
それぞれでandでつなげてみましたが、orの条件がうまく反映されず、一個目の○○だけが検索に引っかかってる状態です。
××や△△もひっかかるようにするにはどう記述したらよいのでしょうか。

Aベストアンサー

データ件数がどのくらいあるのかは分かりませんが、ユニークなキーもなく、likeの任意一致をorでつなぐという方法は、性能を出せませんよ?

select *
from t1
where 入荷日 in(
select max(入荷日)
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
)
and 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

Q差分の月数を算出する方法

午前中に差分の日数を算出する方法は教えて頂けたのですが、
月数を算出する方法が分からなく困っています。

2007/08/27 13:00
2007/07/31 00:00

この時、差分は1ヶ月としたいです。
日数は考慮せず、あくまで年月のみで算出を行いたいです。
但し、1ヶ月はその年月の末日と同値です。

今やってる処理はこんな感じです。
$now = mktime(0, 0, 0, $now["tm_mon"], 1, $now["tm_year"]);
$paradate = mktime(0, 0, 0, $paradate["tm_mon"], 1, $paradate["tm_year"]);
$diff = strtotime($now) - strtotime($paradate);

ここまではいいと思うのですが、次に以下のような処理を行っています。
(途中まで書いて、だめじゃんと思った状態)
$select = $diff / (60 * 60 * 24);

ここで何をやりたいかと言うと、何ヶ月の差分があったかを求めたいのです。
しかし、タイムスタンプの差分を求めた日付(ここでは$paradate)が何月で、末日が
何日だからその分を差し引く、その次の月の末日が何日だからその分を
差し引く~・・・
としていかないと正しい差分が求められないと思うのです。
(28, 29, 30, 31の末日の差がある為)

どうすれば簡単に処理できるのでしょうか?
どなたかご教示下さい。
足りない情報がありましたら随時補足致します。

午前中に差分の日数を算出する方法は教えて頂けたのですが、
月数を算出する方法が分からなく困っています。

2007/08/27 13:00
2007/07/31 00:00

この時、差分は1ヶ月としたいです。
日数は考慮せず、あくまで年月のみで算出を行いたいです。
但し、1ヶ月はその年月の末日と同値です。

今やってる処理はこんな感じです。
$now = mktime(0, 0, 0, $now["tm_mon"], 1, $now["tm_year"]);
$paradate = mktime(0, 0, 0, $paradate["tm_mon"], 1, $paradate["tm_year"]);
$diff = strtotime($now) - st...続きを読む

Aベストアンサー

なるほど・・・
月の差だけ考えればよいなら単純に

<?PHP

$str1="2007/08/27 13:00";
$str2="2007/07/31 00:00";

$date1=strtotime($str1);
$date2=strtotime($str2);
$month1=date("Y",$date1)*12+date("m",$date1);
$month2=date("Y",$date2)*12+date("m",$date2);

$diff = $month1 - $month2;
print $diff;

?>

もちろん、7/31~8/1でも1ヶ月になりますけどね。

Qページ移動した場合の、フォームデータの保持

PHP初心者です。

私が作っているPHPのシステムで、ユーザーがフォームデータ入力途中に、他のページに移動すると、「戻る」ボタンなどですぐに戻ってきても、入力したフォームデータが消えてしまいます。

例えば、この「教えてgoo」の「新しい質問をする」のフォームはPHPで生成されていますが、

http://oshiete1.goo.ne.jp/oshiete_new.php3?c=256

途中でちょっと他のページに行っても、(すぐ戻れば?)入力したデータは保持されますよね。

こんなふうにしたいのですが、どうすればよいでしょうか?
「戻る」ボタンで戻ったときに、サーバーから毎回新しいXHTMLをロードしてくるので、入力データがクリアされてしまうのでしょうか?

フォーム入力⇒確認画面⇒「戻る」ボタンで戻るとフォームデータが保持されないということではなく、あくまでフォーム入力中に、ちょっと他のページに行って戻ってくるという設定です。

よろしくお願いします。

Aベストアンサー

原因はセッション関連にありそうですね。
session_cache_limiter()
というのは指定されていますか?
恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。

もし
session_cache_limiter('nocache');
となっていれば、publicもしくはprivateへ変更してみて下さい。
ないようでしたら、session_start()の前に
session_cache_limiter('public');
session_cache_limiter('private');
のどちらかを記述してみて下さい。
publicだと、クライアントマシン、プロキシのどちらもキャッシュを保持しますが、
privateだとクライアントマシンのみキャッシュを保持します。
どちらが良いのかは使い方によると思いますし、
nocacheでないと困る時もありますから。

session_startを削除してしまって良いかどうかは、
他の部分の処理との関連が分からないので何とも言えないです。

一度試してみて下さい。

参考URL:http://jp.php.net/session_cache_limiter

原因はセッション関連にありそうですね。
session_cache_limiter()
というのは指定されていますか?
恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。

もし
session_cache_limiter('nocache');
となっていれば、publicもしくはprivateへ変更してみて下さい。
ないようでしたら、session_start()の前に
session_cache_limiter('public');
session_cache_limiter('private');
のどちらかを記述してみて下さい。
publicだと、クライアントマシン、プロキシのどち...続きを読む

QPHPによるCSVファイルの指定列検索について

いつも参考にさせていただいております。今回はじめての質問になりますが、よろしくお願いします。

PHPによるCSVファイル内の指定列内を検索する方法について困っております。似たような質問(http://oshiete1.goo.ne.jp/qa3570985.html)を参照しましたが、どうにもわからずほとほと困っている状態です。

とりあえず他サイトを参考にして検索フォームを下記のように作成しました。(ラジオボタンの送信内容は便宜上変更しました)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title></title>
</head>
<body>
<form action="search_4.php" method="POST">
<INPUT type="radio" name="touroku_type" value="りんご">りんご
<INPUT type="radio" name="touroku_type" value="なし">なし
<INPUT type="radio" name="touroku_type" value="ぶどう">ぶどう
<INPUT type="radio" name="touroku_type" value="メロン">メロン
<INPUT type="radio" name="touroku_type" value="スイカ">スイカ<BR>
<input type="submit" name="submit" value="検索">
</form>
<!--ここから検索結果-->
<ul>
<?php
if($_POST["touroku_type"]!=""){
  $KeyWord=$_POST["touroku_type"];
  $KeyWord=htmlspecialchars($KeyWord);
  $Data=file("system.csv");
  for($i=0;$i<sizeof($Data);$i++){
    $lines=strip_tags($Data[$i]);
    if(mb_eregi($KeyWord,$lines)){
      $line=explode(",",$Data[$i]);
?>
<li><?=$line[3]?> → <a href="item.php?id=<?=$line[0]?>">詳細を見る</a></li>
<?php
    }
  }
}
?>
</ul>
</body>
</html>

CSVファイルの登録情報は
1,りんご,あり
2,なし,あり
3,ぶどう,なし
4,メロン,なし
5,スイカ,なし
とします。

この場合、”りんご”や”スイカ”など他で入力されていない情報で検索した場合きちんと出ますが、”なし”で検索すると2から5の情報が出てしまい検索として役に立たない状態です。
ここで質問なのですが、PHP上で指定列のみを検索する場合(上記の場合、配列の2つ目のみを検索対象とする)、上記プログラムのどこを変更すべきなのかご教授いただけますでしょうか?

よろしくお願いします。

いつも参考にさせていただいております。今回はじめての質問になりますが、よろしくお願いします。

PHPによるCSVファイル内の指定列内を検索する方法について困っております。似たような質問(http://oshiete1.goo.ne.jp/qa3570985.html)を参照しましたが、どうにもわからずほとほと困っている状態です。

とりあえず他サイトを参考にして検索フォームを下記のように作成しました。(ラジオボタンの送信内容は便宜上変更しました)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<htm...続きを読む

Aベストアンサー

こんにちは。
はじめまして。

ソースを拝見しました。
「なし」で検索をするとCSVの3列目の「あり・なし」も
引っかかってしまってますね。

ということは2列目のみ検索させなければならないので、
先に explode で各列に分割し、2列目のみを検索対象にします。

こんな感じです。

<!--ここから検索結果-->
<ul>
<?php
if($_POST["touroku_type"]!=""){
$KeyWord=$_POST["touroku_type"];
$KeyWord=htmlspecialchars($KeyWord);
$Data=file("system.csv");
print_a($Data);
for($i=0;$i<sizeof($Data);$i++){
$lines=strip_tags($Data[$i]);
$line=explode(",",$Data[$i]);
if(mb_eregi($KeyWord,$line[1])){
?>
<li><?=$line[1]?> → <a href="item.php?id=<?=$line[0]?>">詳細を見る</a></li>
<?php
}
}
}
?>
</ul>

いかがでしょうか。

こんにちは。
はじめまして。

ソースを拝見しました。
「なし」で検索をするとCSVの3列目の「あり・なし」も
引っかかってしまってますね。

ということは2列目のみ検索させなければならないので、
先に explode で各列に分割し、2列目のみを検索対象にします。

こんな感じです。

<!--ここから検索結果-->
<ul>
<?php
if($_POST["touroku_type"]!=""){
$KeyWord=$_POST["touroku_type"];
$KeyWord=htmlspecialchars($KeyWord);
$Data=file("system.csv");
print_a($Data);
for($i=0;$i<siz...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報