• ベストアンサー

GET POST の引数渡しについて

現在、PHPにて掲示板を製作中です。 スレッド型でタイトルをクリックすると<a href="...?記事のNo.&...">タイトル</a>とGETで情報を渡し、その書き込みが表示される仕組みです。 書き込みフォームからの情報はPOSTで渡します。といたって普通の仕組みだと思うのですが、問題はGETで受けた値をPOSTで更新できないのです。 どういう事かというと、まずタイトルをクリックしNo.1の記事を表示します、そのときURIの表示は[ http://・・・.php?type=tree$log=1 ]になっているとします。 そのNo.1の記事に返信するために内容を書き込んでsbumitボタンを押して記事をPOSTで送信します。 返信記事はNo.2になります。すると返信されたNo.2の記事内容を表示し、No.1はスレッドでタイトルだけの表示になるようにしてるのですが、そのときのURIの表示は[ http://・・・.php?type=tree$log=1 ]ままなのです。そのため、画面ではNo.2を表示してるですが、URIはNo.1のままなので、No.1のタイトル部分をクリックしても、No.1を読み込みに行ってくれません。 No.0があったとしてNo.0をクリックするときちんと表示されます。おそらくNo.1をクリックしたGETの情報を引きずっていてまだNo.1を表示していると思っているためだと思うのですが、POSTで渡した場合はGETの情報を更新できないのでしょうか? 何を言っているのかよくわからないかと思いますが、何か解決策はないでしょうか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

<form action="bbs.php" method="post"> このフォームのaction先に、 $_SERVER['PHP_SELF'] $_SERVER['SCRIPT_NAME'] $_SERVER['REQUEST_URI'] とかでプログラム名を入れていると、ページURIの全部が入ってしまい <form action="bbs.php?mode=read&number=1" method="post"> となっているんではないでしょうか? その次のリンクは、同一URIなので、ブラウザはreloadしていない と言う状態かな?? 対策1 action先は、$_SERVER[] で指定せず、直接「bbs.php」を入れておく 対策2 post後画面の出力は、location header送信として、bbs.php?mode=read&number=7 のようにURI変更する(post情報も消えるので、リロードで2重送信にならないで済みます)。 対策3 または、post後画面の出力時のheaderに nocache 情報を追加、ブラウザによってはmetaタグでnocache情報も付けた方がよい。 書式は、ちょっと失念。nocacheで調べてみて下さい

tetsu222
質問者

お礼

いま、見直してみたところaction先の変数の受け渡しがうまくいってませんでした。単純ミスでした。ご迷惑をおかけいたしまた。 しかし$_SERVER[] やlocation headerのことを今回知れて大変勉強になりました。ありがとうございます。また何かありましたらよろしくお願いいたします。

tetsu222
質問者

補足

hrm_mmmさん有難うございます。 対策1についてですが、掲示板を数ページ作るため、bbs1.php、bbs2.phpなどと出力のHTML用のphp別にしています。そのためどうしてもaction先は変数での指定になってしまうのです。対策2・3については勉強不足の為、そのようなことができることを知りませんでした。どのようにするのか知識がないので調べてやってみたいと思います。月曜日までちょっと時間がなくできません。月曜にやってみます。ありがとうございました。

その他の回答 (1)

  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.1

こんにちは。 。。。うん。正直、何を言っているのかイマイチです(汗 ページ(ソース)の移り変わり、どこがどうなるのやらさっぱり(汗 PTP使いじゃなく、ASPユーザーですが。。。 とりあえず、確認事項。。。(?) ・POSTとGETのMethodでの宣言をちゃんと行っていますか? ・targetの指定はズレてませんか? ・POSTとGETが混在してませんか? 一応、混在していてもいい場合はあるんですけど、GET指定の場合は、POSTが使用できなかったかな?と記憶してます。 POST指定の時は、GETも使える。。。ような記憶が。。。 まずは 「このページの時にGETの値はこうなっていて、POSTの値はこうなっていて。。。」 と、使用する値のものを全て目に見える形で出したほうがやりやすいかと思いますよ。

tetsu222
質問者

補足

STICKY2006さん、ありがとうございます。 説明下手で申し訳ありません。 一応、流れを説明いたします。 最初はスレッドでタイトルだけを表示しています。 ●ログNo.1・・・・・・  LログNo.2・・・・・・   LログNo.4・・・・・・ ●ログNo.3・・・・・・  LログNo.5・・・・・・   LログNo.6・・・・・・ とこんな感じでの表示なってます。 ↓   <a href="bbs.php?mode=read&number=1">タイトル</a> ↓    ログNo.1のタイトルクリックでGETで情報を渡します。 ●ログNo.1   メッセージをなどを表示  --------------------------     返信フォーム  LログNo.2・・・・・・   LログNo.4・・・・・・ この様にNo.1の内容を表示。 この時点のURIは[http://・・・・・.bbs.php?mode=read$number=1]です。 ↓  返信フォームにメッセージを書き込み送信 ↓  <form action="bbs.php" method="post"> ↓ <input type="hidden" name="mode" value="message"> ↓ <input type="hidden" name="number" value="7"> ↓ ほか書き込まれた内容をPOSTで送ります。 ●ログNo.1・・・・・・  LログNo.2・・・・・・   LログNo.4・・・・・・  LログNo.7  メッセージをなどを表示  -------------------------- と表示されます。 この時点でURIは[http://・・・・・.bbs.php?mode=read$number=1]のままなのです。 ですので、No.1のタイトルをクリックしてもNo.1の内容は表示されません。 No.2やNo.4は表示されます。 [http://・・・・・.bbs.php]とならないのです。

関連するQ&A