- ベストアンサー
GETを使わずにPOSTで送信…したいのですが。
いつもお世話になっております。 また教えて欲しい事がありまして、投稿させて頂きました。 どなた様かご教授宜しくお願い致します。 今現在、GETを使ってのデータ送信は行える用にはなっているのですが、色々調べていった結果GET送信では様々な危険性(POST送信でも 危険性があるのは変わりないみたいですが…)が伴うという事 でしたので、どうにかPOST送信に変更したいと思っています。 今後、更なる重要なデータを送るようなプログラムを書いていく際に 役立てていけるようになればと思っています。 以下ソースです。 ↓↓↓↓ <html> <head> <meta http-tquiv="Content-Type" content="text/html;charset=EUC-JP"> <title>calendar</title> </head> <body> <form name="form1" action="yotei.php" method="post"> <?php $year = date("Y"); $month = date("n"); $day = date("j"); $year2=$_GET["year"]; $month2=$_GET["month"]; $day2=$_GET["day"]; //先月、来月をクリックした場合の処理 if($year2!="" || $month2!="" || $day2!="") { if($year2!="") { $year = $year2; } if($month2!="") { $month = $month2; } if($day2!="") { $day = $day2; }else { $day = 1; } } // カレンダー表示(先月の場合) if($month==1) { $year3 = $year-1; $month3 = 12; }else { $year3 = $year; $month3 = $month-1; } // カレンダー表示(来月の場合) if($month==12) { $year4 = $year+1; $month4 = 1; }else { $year4 = $year; $month4 = $month+1; } print "<table border='1' align='center'><tr>"; print "<td width='250' align='center' bgcolor='yellowgreen' colspan='7'>"; print "<a href=\"?year=$year3&month=$month3\"><</a>"; print " ".$year."年".$month."月のカレンダー "; print "<a href=\"?year=$year4&month=$month4\">></a></td></tr>"; print "<tr><td align='center' bgcolor='pink'>日</td>"; print "<td align='center' bgcolor='silver'>月</td>"; print "<td align='center' bgcolor='silver'>火</td>"; print "<td align='center' bgcolor='silver'>水</td>"; print "<td align='center' bgcolor='silver'>木</td>"; print "<td align='center' bgcolor='silver'>金</td>"; print "<td align='center' bgcolor='skyblue'>土</td></tr>"; $week = date(w,mktime(0,0,0,$month,1,$year)); for ($ix1 = 0 ; $ix1 < $week ; $ix1++) { print "<td align='center'>-</td>"; } // ファイルの読み込み $data = './data.CSV'; $file = fopen($data,"r"); while(!feof($file)){ $csv = fgets($file); $csv = mb_convert_encoding($csv, "EUC-JP", "SHIFT-JIS"); //csvファイルを配列に格納 $str = explode(",", $csv); for($day = 1 ; checkdate ($month,$day,$year) ; $day++) { if($str[1] == "$year/$month/$day") { $ymd[] = $str[1]; $all[] = "<br>予定=$str[0] <br>開始日=$str[1] <br>終了日=$str[2] <br>"; } } } if(($day+$week)%7 == 1 ) { print "bgcolor='pink'><font color='red'>"; }else if(($day+$week)%7 == 0 ) { print "bgcolor='skyblue'><font color='blue'>"; }else { print "bgcolor='wheat'>"; } $enc = ''; for($i=0 ; $i<count($ymd) ; $i++) { if($ymd[$i] == "$year/$month/$day") { $enc = $enc.urlencode($all[$i]); print "<a href=yotei.php?yotei=$enc>"; } } print "$day</a></td>"; if(($day+$week)%7 == 0 ) { print "</tr>"; } } fclose($file); $weekend = date(w,mktime(0,0,0,$month,$day,$year)); for ($ix2=0 ; $ix2<(7-$weekend) ; $ix2++) { if ($weekend != 0) { print "<td align='center'>-</td>"; } } print "</tr>"; print "</table>"; ?> <table border='0' align='center'> <tr> <td width="250"> <div align="center"> <input type="button" value="戻る" onClick="location.href='data.php'" name="button"> </div> </td> </tr> </table> <br><br> </form> </body> </html>
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
説明がややこしいので、ソースを解析してもらうということで、直してしまいました。これで動くと思います。 yotei.phpやCSVの中身がわからないので、推測ですが。 エラー対策や、気がついたバグ取りなんかも入れてしまってます。 変更:とコメント入れてますので、変更点を見てください。 <html> <head> <meta http-tquiv="Content-Type" content="text/html;charset=EUC-JP"> <title>calendar</title> </head> <body> <form name="form1" action="yotei.php" method="post"> <?php $year = date("Y"); $month = date("n"); $day = date("j"); $year2=$_GET["year"]; $month2=$_GET["month"]; $day2=$_GET["day"]; //先月、来月をクリックした場合の処理 if($year2!="" || $month2!="" || $day2!="") { if($year2!="") { $year = $year2; } if($month2!="") { $month = $month2; } if($day2!="") { $day = $day2; }else { $day = 1; } } // カレンダー表示(先月の場合) if($month==1) { $year3 = $year-1; $month3 = 12; }else { $year3 = $year; $month3 = $month-1; } // カレンダー表示(来月の場合) if($month==12) { $year4 = $year+1; $month4 = 1; }else { $year4 = $year; $month4 = $month+1; } print "<table border='1' align='center'><tr>"; print "<td width='250' align='center' bgcolor='yellowgreen' colspan='7'>"; print "<a href=\"?year=$year3&month=$month3\"><</a>"; print " ".$year."年".$month."月のカレンダー "; print "<a href=\"?year=$year4&month=$month4\">></a></td></tr>"; print "<tr><td align='center' bgcolor='pink'>日</td>"; print "<td align='center' bgcolor='silver'>月</td>"; print "<td align='center' bgcolor='silver'>火</td>"; print "<td align='center' bgcolor='silver'>水</td>"; print "<td align='center' bgcolor='silver'>木</td>"; print "<td align='center' bgcolor='silver'>金</td>"; print "<td align='center' bgcolor='skyblue'>土</td></tr>"; $week = date(w,mktime(0,0,0,$month,1,$year)); for ($ix1 = 0 ; $ix1 < $week ; $ix1++) { print "<td align='center'>-</td>"; } // ファイルの読み込み $data = './data.CSV'; //変更:ファイルがオープンできなかった場合に、無限ループを防ぐ if($file = @fopen($data,"r")){ while(!feof($file)){ $csv = fgets($file); $csv = mb_convert_encoding($csv, "EUC-JP", "SHIFT-JIS"); //csvファイルを配列に格納 $str = explode(",", $csv); for($day = 1 ; checkdate ($month,$day,$year) ; $day++) { if($str[1] == "$year/$month/$day") { $ymd[] = $str[1]; $all[] = "<br>件名=$str[0] <br>内容=$str[1] <br>開始日=$str[2] <br>終了日=$str[3] <br>"; } } } //変更:ファイルを閉じる位置を変更 fclose($file); } for($day = 1 ; checkdate ($month,$day,$year) ; $day++) { print "<td align='center'"; if(($day+$week)%7 == 1 ) { print "bgcolor='pink'><font color='red'>"; }else if(($day+$week)%7 == 0 ) { print "bgcolor='skyblue'><font color='blue'>"; }else { print "bgcolor='wheat'>"; } $enc = ''; for($i=0 ; $i<count($ymd) ; $i++) { if($ymd[$i] == "$year/$month/$day") { $enc = $enc.urlencode($all[$i]); } } //変更:以下1行場所を移動、ループの中から外に出した。 //変更:form1.yoteiにデータを設定して、SubmitするようにJavaScriptを書き換え print "<a href='#' onClick='javascript:document.form1.yotei.value=\"{$enc}\";document.form1.submit();'>"; // 追加 print "$day</a></td>"; if(($day+$week)%7 == 0 ) { print "</tr>"; } } $weekend = date(w,mktime(0,0,0,$month,$day,$year)); for ($ix2=0 ; $ix2<(7-$weekend) ; $ix2++) { if ($weekend != 0) { print "<td align='center'>-</td>"; } } print "</tr>"; print "</table>"; //変更:以下のもの削除、最後のループで設定された$enc固定で渡している //print "<input type='hidden' name='yotei' value='$enc'>"; // 追加 ?> <!-- 変更:空白のyoteiを用意する --> <input type='hidden' name='yotei' value=''>; <table border='0' align='center'> <tr> <td width="250"> <div align="center"> <input type="button" value="戻る" onClick="location.href='data.php'" name="button"> </div> </td> </tr> </table> <br><br> </form> </body> </html>
その他の回答 (4)
- nick9090
- ベストアンサー率26% (102/378)
セキュリティの観点から言えば、GETをPOSTに変えてもほぼ全く無意味です。 本当に安全を期すなら、SSL(https)で通信するようにしてください。
- BellBell
- ベストアンサー率54% (327/598)
補足です ├yotei.php └[data]フォルダ ├2000-10-1.csv ├2000-10-2.csv └2000-10-3.csv 一つの例ですが、上記のようなシステム構成にして、 yotei.php?year=2000&month=10&day=1 と呼び出して、データが存在すればyotei.php内でファイルを開いて、データ表示編集をする設計をお勧めする。 そうすると、GETで呼び出すことは別に問題がない。 (ユーザが手作業でアドレス欄に入力をするのも、やりたいならどうぞって感じですね) year=2000&month=10&day=32 のように、日付として問題のあるデータが渡された場合、『日付が正しくありません』とエラー表示させればよいかと。 必ずしも、日別のファイル構成にしなくても良いですが、今のままだとデータが増えた場合でも毎回すべての読み込みが必要なので、どんどん遅くなってきます。 (仮に毎日3件入力すると、1年弱で1000件になります。) 少々気になったので、老婆心ながら。
お礼
BellBell様 たくさんのご教授誠にありがとうございました。 確かに予定が増えていけば遅くなっていってしまうのは問題 ですね(汗 細部まで気にかけてくださって本当に感謝致します。 早速ソースの修正をしたところ、データの受け渡しが行われ ていることが確認できました☆ まさに感動ですっ!! ここからは受け渡されたページで表示がされるように頑張っ てプログラムを作成させていこうと思います♪♪
- BellBell
- ベストアンサー率54% (327/598)
まとめると、formとボタンを使わずに、リンクでPOSTする方法って事ですかね? リンクをクリックすることで、JavaScriptを使って、(見えない)フォームにデータを設定して、送信って事ができますね。 下記は適当に作った、送信部分のみのサンプルです。 <html> <head> <script type="text/JavaScript"> function SendPost( Y, M, D){ document.hiddenform.year.value = Y; document.hiddenform.month.value = M; document.hiddenform.day.value = D; document.hiddenform.submit(); } </script> </head> <body> <form action="./next.php" name="hiddenform" method="post"> <input type="hidden" name="year" value="" /> <input type="hidden" name="month" value="" /> <input type="hidden" name="day" value="" /> </form> <a href="javascript:SendPost('1999','11','2');" >1999/11/2</a><br /> <a href="javascript:SendPost('2000','10','31');" >2000/10/31</a><br /> </body> </html>
お礼
BellBell様 度々ご教授ありがとうございます。 サンプルを参考させて頂いたのですが、思った様にいきませんでした(涙 formは使ってPOST送信したいと思うのですが… 自分なりに足らない知恵を振り絞ってソースを変更してみましたが、ここからどうしたら良いか悩んでいます…orz もし、また再度ご教授頂ける様でしたら、宜しくお願い致します。
補足
変更したソースです。 ↓↓↓↓ <html> <head> <meta http-tquiv="Content-Type" content="text/html;charset=EUC-JP"> <title>calendar</title> </head> <body> <form name="form1" action="yotei.php" method="post"> // 追加 <?php $year = date("Y"); $month = date("n"); $day = date("j"); $year2=$_GET["year"]; $month2=$_GET["month"]; $day2=$_GET["day"]; //先月、来月をクリックした場合の処理 if($year2!="" || $month2!="" || $day2!="") { if($year2!="") { $year = $year2; } if($month2!="") { $month = $month2; } if($day2!="") { $day = $day2; }else { $day = 1; } } // カレンダー表示(先月の場合) if($month==1) { $year3 = $year-1; $month3 = 12; }else { $year3 = $year; $month3 = $month-1; } // カレンダー表示(来月の場合) if($month==12) { $year4 = $year+1; $month4 = 1; }else { $year4 = $year; $month4 = $month+1; } print "<table border='1' align='center'><tr>"; print "<td width='250' align='center' bgcolor='yellowgreen' colspan='7'>"; print "<a href=\"?year=$year3&month=$month3\"><</a>"; print " ".$year."年".$month."月のカレンダー "; print "<a href=\"?year=$year4&month=$month4\">></a></td></tr>"; print "<tr><td align='center' bgcolor='pink'>日</td>"; print "<td align='center' bgcolor='silver'>月</td>"; print "<td align='center' bgcolor='silver'>火</td>"; print "<td align='center' bgcolor='silver'>水</td>"; print "<td align='center' bgcolor='silver'>木</td>"; print "<td align='center' bgcolor='silver'>金</td>"; print "<td align='center' bgcolor='skyblue'>土</td></tr>"; $week = date(w,mktime(0,0,0,$month,1,$year)); for ($ix1 = 0 ; $ix1 < $week ; $ix1++) { print "<td align='center'>-</td>"; } // ファイルの読み込み $data = './data.CSV'; $file = fopen($data,"r"); while(!feof($file)){ $csv = fgets($file); $csv = mb_convert_encoding($csv, "EUC-JP", "SHIFT-JIS"); //csvファイルを配列に格納 $str = explode(",", $csv); for($day = 1 ; checkdate ($month,$day,$year) ; $day++) { if($str[1] == "$year/$month/$day") { $ymd[] = $str[1]; $all[] = "<br>件名=$str[0] <br>内容=$str[1] <br>開始日=$str[2] <br>終了日=$str[3] <br>"; } } } for($day = 1 ; checkdate ($month,$day,$year) ; $day++) { print "<td align='center'"; if(($day+$week)%7 == 1 ) { print "bgcolor='pink'><font color='red'>"; }else if(($day+$week)%7 == 0 ) { print "bgcolor='skyblue'><font color='blue'>"; }else { print "bgcolor='wheat'>"; } $enc = ''; for($i=0 ; $i<count($ymd) ; $i++) { if($ymd[$i] == "$year/$month/$day") { $enc = $enc.urlencode($all[$i]); print "<a href='#' onClick='javascript:document.form1.submit();'>"; // 追加 } } print "$day</a></td>"; if(($day+$week)%7 == 0 ) { print "</tr>"; } } fclose($file); $weekend = date(w,mktime(0,0,0,$month,$day,$year)); for ($ix2=0 ; $ix2<(7-$weekend) ; $ix2++) { if ($weekend != 0) { print "<td align='center'>-</td>"; } } print "</tr>"; print "</table>"; print "<input type='hidden' name='yotei' value='$enc'>"; // 追加 ?> <table border='0' align='center'> <tr> <td width="250"> <div align="center"> <input type="button" value="戻る" onClick="location.href='data.php'" name="button"> </div> </td> </tr> </table> <br><br> </form> </body> </html>
- BellBell
- ベストアンサー率54% (327/598)
> $year2=$_GET["year"]; > $month2=$_GET["month"]; > $day2=$_GET["day"]; 上のそれぞれを、下のように$_POSTに書き直せばいいんじゃないかな? $year2=$_POST["year"]; $month2=$_POST["month"]; $day2=$_POST["day"]; GETの場合の危険性は、目に見えるだけに気軽に値を変更されるって事ですね。 POSTの場合も値を変更してデータを渡すのは、簡単だけどメンドクサイので、わざわざやらないだろうって予測レベルですね。 GETの場合はブックマーク可能であるとかリンクを書くのが簡単って利点もありますし、結局はどちらが目的に合うかって使い分けですかね。
補足
BellBell様 回答ありがとうございます。 私の説明不足で申し訳ございません。 やりたい内容としては、カレンダーの日付についているリンクに Uploadしたファイルの該当日内容をPOSTで送信して、別ウィンドウ で開きたいというものです。 今現在は、GET送信で該当日内容を受渡し、別ウィンドウで表示して いるのですが、先にも述べました様にGET送信ではURLに直で内容が 記されてしまいますので、これをどうにかしたいと思っています。 度々申し訳ございませんが、ご教授宜しくお願い致します。
お礼
nick9090様 ご教授ありがとうございます。 早速調べて、SSLも参考にさせて頂きたい と思います。 本当にありがとうございます♪♪