投稿部分の作成(リダイレクト)
ここまで、表示部は順調に製作してきたつもりですがひとつ問題点が出てきました。
Perlなどで今まで作ってきたプログラムは、1つのファイルでGETやPOSTから受け取った値を使用して処理を分岐するように作っていました。しかし、今回はなんとなく役割ごとにファイルを分けてしまったのです。
何が問題かというと、投稿した後にどうやってトピックのページやメッセージのページを表示させるかということです。
1つのファイルで(includeやrequireは除く)実行している場合は、テンプレートを切り替えてなどと考えられるのですが・・・
そこで、いろいろ調べてみたところリダイレクトという方法が使えそうです。
ステータスコード301と302といわれるもので、ほとんどのWebブラウザは自動的にこのコードを認識し、リダイレクト先のURLを読みに行きます。
phpでこれを実現するには、 header 関数を使用します。
header 関数は、生のHTTPヘッダを送信します。この関数を使ってLocationヘッダを送信することでリダイレクト(ステータスコード302)が実現できます。
それでは、ソースです。
if($_POST['pid'] != ''){
header("Location: http://localhost:80/msg.php?fid=" . $_POST['fid'] . "&tid=" . $_POST['tid'] . "&pid=" . $_POST['pid']);
}
else{
header("Location: http://localhost:80/topic.php?fid=" . $_POST['fid'] . "&tid=" . $_POST['tid']);
}
このリダイレクトは、後々使えそうなので関数としてまとめてもよさそうですね。
$_POSTというスーパーグローバル変数が登場しています。これは、投稿部分はメッセージなどの大きな情報を受け取るためPOSTメソッドでデータをやり取りしています。その際、HTMLのhiddenを使用して必要なID情報を受け渡すようにしています。
例:テンプレート(hidden)
<form name="post" method="post" action="post.php">
<table bgcolor=#FFFFFF cellspacing=0 cellpadding=0>
<tr><td>
<table width=700>
<tr bgcolor=#7B9FB6>
<td colspan=2 align=center>新規投稿</td>
</tr>
<tr bgcolor=#E7EFF0>
<td valign=top><b>subject:</b></td><td><input type="text" name="subject" size="50">
<input type="hidden" name="fid" value={$getdata.fid}>
<input type="hidden" name="tid" value={$getdata.tid}>
<input type="hidden" name="pid" value={$getdata.pid}>
<input type="hidden" name="pg" value={$getdata.pg}>
</td>
</tr>
<tr bgcolor=#E7EFF0>
<td valign=top><b>name:</b></td><td><input type="text" name="name" size="50"></td>
</tr>
<tr bgcolor=#E7EFF0>
<td valign=top><b>message:</b></td><td><textarea name="message" cols="70" rows="15"></textarea></td>
</tr>
<tr bgcolor=#E7EFF0>
<td> </td><td><input type=submit value="投稿"></td>
</tr>
</table>
</td></tr>
</table>
</form>
これで、リダイレクトはできるようになりました。