簡単なお知らせを表示する(2)
簡単なお知らせを表示する(1)の続き。今回は前回のものに「内容に入力漏れがあったらエラー文を表示する」っていう機能を加えたいです。
考えたコト
- 前回のタイトルと本文の中身が空じゃなかったら「if(($subject !== "") && ($body !== ""))」の部分を逆に中身が空だったらに変更してエラー処理の内容を入れる。
- 今回はタイトルと本文、どちらも必須項目なので、中身が空だったらの場合はどちらか一方が空の場合もNGなので演算子は「&&」じゃなくて「||」を使う。
- その後、elseの中にタイトルと本文の中身が空じゃなかったらの処理を入れて前回と同様の処理をする。
ではさっそくですが、エラー処理の部分
論理演算子の部分、前回使った論理積が「&&」と「and」の2種類あったように、今回の論理和にも「||」と「or」の2種類あった。これもまた優先順位の違いとのこと。
>>演算子の優先順位
ということで、「||」の方を使うことにする。「$a || $b・・・$a または $b のどちらかが TRUE の場合に TRUE」
//タイトルと本文の中身が空なら・・・の処理
if(($subject == "") || ($body == "")){
echo "<p>タイトルと本文はどちらも必須項目です。</p>";
echo "<p><a href=\"javascript:history.back();\">入力画面へ戻る</a></p>";
}else{
//以下、中身が空じゃなかったらの処理がつづく
タイトル、本文のどちらか一方、または両方が空だった場合「タイトルと本文はどちらも必須項目です。」と表示させる。画面が遷移するから入力画面に戻れるようにjavascriptのhistory.back();で元の画面に戻れるようにした。JS無効だったら・・・ブラウザの「戻る」でお帰り下さいみたいな。今回はどうせ入力画面のページのurlは決まってるし、普通にファイル名指定してリンクにした方が親切か。そうしよう。
echo "<p><a href=\"index.html\">入力画面へ戻る</a></p>";
に変更。「"」の前に入ってる「\」は「""」で囲まれた中で「"」を使う時は\でエスケープするっていう決まりごと。たまにコレ忘れてエラーが出てビクッとなるのでこれからも忘れないようにしなきゃ。
どうしよう。エラー処理終わってしまった。・・・何か芸がない気がするからタイトルと本文、何が入力漏れなのか、それぞれ別のエラー文を出してみようかな。
項目別にエラー文を出す
個別にエラー文を出す書き方っていろいろ考えたんだけど、一番短くて分かりやすいのを採用することにした。考えたのはこういう手順。
- タイトルが空だったら$errorにエラー文を入れる。
- 本文が空だったら$errorにエラー文を加える。
- 両方空じゃなかったら(エラーがなかったら)いつもの処理をする。
if(!$subject){$error = "タイトルを入力してください。<br />";}
if(!$body){$error .= "本文を入力してください。<br />";}
echo $error;
if(!$error){
両方中身が空じゃなかった時の処理
}
上の方では「$subject == ""」みたいな書き方したけど「!$subject」っていう書き方に変えてみた。こっちの方がカッコいいなと思って。理由はただそれだけ。なんか短いし。プロっぽいし。
タイトルが抜けてる時は「タイトルを入力してください。」を表示、本文が抜けてる時は「本文を入力してください。」を表示、両方抜けてる時はその両方の文を表示。
本文の中身が空だったらの処理の中の「.=」は結合代入演算子っていうもの。私のバイブルによると、これを使う時は代入先の変数の初期値に注意せよとのこと。前の処理で変数に値が残ってるとそれにプラスして追加されるので、結合代入演算子を使う前に変数をクリアしたり初期値をセットしたりしておくとよい、と。ん?今回みたいな場合は問題ないと思って大丈夫?これ最初に「$error = "";」とか書いておいた方がいいの?それとも元々$errorはそれまでに出てきてないからそういう時はスルーでいいモノ?あれ。あれ。混乱中。まぁ意図した動きにはなってるのだけれども。
今回のエラー処理部分を追加したソース全文
ほとんど前回のと一緒。エラー絡みの部分だけ追加したり変更したり。
<?php
//受け取ったデータを変数に入れる
$subject = @$_POST["subject"];
$body = @$_POST["body"];
$time = date("Y/m/d H:i:s");
//ログ用データファイル
$data_file = "data.dat";
//送信ボタンが押されたら
if($_POST["submit"]){
//タイトルと本文の中身が空ならエラー文表示
if(!$subject){$error = "タイトルを入力してください。<br />";}
if(!$body){$error .= "本文を入力してください。<br />";}
echo $error;
//エラーがなかったら
if(!$error){
//エスケープ
$subject = htmlspecialchars($subject, ENT_QUOTES);
$body = htmlspecialchars($body, ENT_QUOTES);
//$bodyの改行文字を<br />へ
$body = nl2br($body);
//改行コードを正規表現で置換
$body = ereg_replace("\n|\r|\r\n","",$body);
//変数を配列にしてタブ区切りで結合
$news = implode("\t",array($subject,$body,$time));
//ログ用ファイルを開く
$file = fopen($data_file,"a") or die("エラー");
//ロック
flock($file,LOCK_EX);
//データを書き込む
fputs($file,"$news\n");
//ロック解除
flock($file,LOCK_UN);
//ファイルを閉じる
fclose($file);
//表示用にファイルを読み込んで配列にセット
$news_list = file($data_file);
$news_list = array_reverse($news_list);
$news_num = count($news_list);
//書き込まれたデータの数だけ繰り返し
//上で結合してたのをタブ区切りで分解して変数に値をセット
for($i = 0; $i < $news_num; $i++){
list($subject2,$body2,$time2) = explode("\t",$news_list[$i]);
echo "<h1>$subject2</h1>\n";
echo "<p>更新日時:$time2</p>\n";
echo "<p>$body2</p>\n";
}
}
}
?>
次はどうしよ。一番最初に「後で!」って書いたモノを順番にやっていこうかな。このままだと延々とログが出てくるので次は最大表示件数とか決めれるようにする。
<< 簡単なお知らせを表示する(1) | 簡単なお知らせを表示する(3) >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/207
