index.php
<form method="POST" action="./validate.php"> 氏名:<input type="text" name="shimei" maxlength="64"><br /> メアド:<input type="text" name="mail" maxlength="64"><br /> 性別: <input type="radio" name="sex" value="1">男 <input type="radio" name="sex" value="2">女<br /> <input type="submit" name="soushin" value=" 確認 "> </form> |
まあよくあるフォームです。actionを指定したのでvalidate.phpを作らなくてはなりません。
何をするかというと入力値のチェックです。
validate.php
#初期設定 #入力をチェック #エラーの有無で分岐 |
簡単に流れを書くと以上のようになります。
性別は入る値が1か2に決まっているので、判定も1か2かで行います。
radio、checkbox、hiddenは最初から決められている値以外に変更することはできないように見えますが、実は簡単に行えます。
外部から入ってくるデータは基本的に汚染されているものだと考えてチェックを行う必要があります。
保存部分は簡単に作成します。
保存部分は「,」で区切っているだけなので、入力値に「,」を入れられると困ったことになりますが、今回はまあパスします。
form.txtは予め作成しておかねばなりませんが、これで保存部分ができました。
validate_ok.php
$data=$shimei.','.$mail.','.$sex; $fp = fopen("form.txt","r+"); flock($fp,LOCK_EX); fputs($fp,$data); fclose($fp); |
さて、入力のエラーがあった場合もとの入力画面に戻されるのはよくある光景ですが、このときにせっかく登録した内容が消えていたりすると非常にがっかりです。
入力した内容を保持しておいて、入力画面に戻ってきた場合には最初から表示されるようにしましょう。
新たに以下のようなエラー画面を用意して、validate.phpに組み込んであげればよいことになります。
内容的には、valueにフォームから送信されてきた値をセットしているだけです。
htmlspecialcharsという不思議な関数ですが、入力値に「"><script>alert("XSS");</script>」と入れてみるとその理由がわかります。
validate_error.php
<?php print($error_message_array); ?> <form method="POST" action="./validate.php"> 氏名:<input type="text" name="shimei" maxlength="64" value="<?php print(htmlspecialchars($shimei)); ?>"><br /> メアド:<input type="text" name="mail" maxlength="64" value="<?php print(htmlspecialchars($mail)); ?>"><br /> 性別: <input type="radio" name="sex" value="1"<?php if($sex==1){print(" checked");} ?>>男 <input type="radio" name="sex" value="2"<?php if($sex==2){print(" checked");} ?>>女<br /> <input type="submit" name="soushin" value=" 確認 "> </form> |
しかしindex.phpとほとんど同じ内容なのに、わざわざもう一度作るのも馬鹿みたいです。
多くの言語と違い、PHPはデフォルトの設定では、未定義の変数を呼び出したとき中身が空として扱ってくれます。
従ってvalidate_error.phpをそのままindex.phpにリネームすれば何事もなく動いてくれます。
ただしerror_reporting等で厳しくエラーチェックしているとエラーが発生します。
その場合はまた変数の存在確認などの処理を行ったりしなければなりません。
面倒なので全部纏めてしまいましょう。
index2.php
<?php <?php print($error_message_array); ?> <?php |
フォームのデータを自分自身に送っています。
$_POSTの値が存在すればそれを代入し、存在しなかった場合は空として扱ってくれます。
1ページで投稿フォームを作成することができました。
細かな部分でまだ問題がありますが、ひとまずは以上で完成です。
次回は投稿確認画面でも作りましょうか。
ところでこのブログって横幅どうにかならないんですかね?