簡単なお知らせを表示する(4)
前回の続き。今回は「パスワードを入れないと登録できない」っていう機能を考えてみます。だんだんパワーアップしてきた。
考えた流れ
- 入力ページ(index.html)にパスワードを入力するためのinputタグを追加。
- 処理・表示をするページ(news.php)で最初にパスワードを決めて変数に入れておく。
- 入力されたパスワードの値も変数に入れておく。
- 送信ボタンが押された時に、タイトルや本文同様にパスワードが入力されてるか確認。抜けてたらエラー。
- 変数に入れておいたパスワードと入力されたパスワードが一致するかどうか確認する。
- 一致しない場合は、エラーメッセージを表示する。
- 一致した場合は、いつもの処理を始める。
入力ページ(index.html)にパスワードを入力するためのinputタグを追加。
ここはサラっと追加。(以下はindex.htmlのソース)
<form method="post" action="news.php">
<dl>
<dt>タイトル</dt>
<dd><input type="text" name="subject" /></dd>
<dt>本文</dt>
<dd><textarea name="body" cols="50" rows="6"></textarea></dd>
</dl>
<p>パスワード:<input type="password" name="password" /> <input type="submit" name="submit" value="送信する" /></p>
</form>
最初にパスワードを決めて変数に入れておく。
入力されたパスワードの値も変数に入れておく。
ここからはまたnews.phpの方のソース。まず、普通に変数$passwordに自分で決めたパスワードを代入。入力フォームから受け取るパスワードの値も変数に入れておく。
//予め決めたパスワード
$password = "test";
//フォームから受け取る値を代入
$pass = @$_POST["password"];
この2つをnews.phpの一番上の方に書いてた変数がいろいろ並んでるところに追加する。なんかその並び増えたな。ログ用ファイル名の指定と最大件数の指定、このパスワードの指定は後で一番上にもってきた方がいい気がしてきた。なんかそういう風な自分で設定する項目が頭にきてるソースよく見かけるし。
パスワードが入力されてるかどうか確認。
前にタイトルと本文の中身が空だったらエラー文を出してた部分の並びに今回のパスワードが空だったら・・・を加える。
//タイトルと本文とパスワードの中身が空ならエラー文表示
if(!$subject){$error = "タイトルを入力してください。<br />";}
if(!$body){$error .= "本文を入力してください。<br />";}
if(!$pass){$error .= "パスワードを入力してください。<br />";}
echo $error;
ここは問題なく意図どおり動いた。
パスワードが一致するかどうか確認
その後、上の流れのままecho $error;の上に
if(!($pass == $password)){$error .= "パスワードが違います。<br />";}
って書いたらパスワードが抜けてる場合
パスワードを入力してください。
パスワードが違います。
って2行とも表示されてしまった。パスワード抜けてるのに「違います」が出てくるのもどうよと思ったので、
elseif(!($pass == $password)){$error = "パスワードが違います。<br />";}
に変更してみた。パスワードが抜けてたら「パスワードを入力してください。」抜けてないけど一致してなかったら「パスワードが違います。」が表示されるようになった。タイトルや本文のどっちかが抜けてたりとかなんやかんやイレギュラー試したけど大丈夫だった。
コレ分からなかった!メモ
でもなーんかコレ怪しい気がする。「if { } else { }」の形はよく見るけど、「if{ } elseif{ }」って最後のelseなしで終わってるのは見た記憶ないんですけど。エラーはでなかったけど不安だ。
だけどその elseif を else にしたら、ちゃんと入力されてても「パスワードが違います」って出てくるし、どうしたらいいのか詰まってしまった。「else{ }」とか「else{$error = NULL;}」とか書書いておかないとあかんのだろうか。とりあえず見た目にはエラーもないしちゃんと動いてるように見えるから・・・とりあえずこのままでいいか。
コレ分かった!メモ
上の部分、恥ずかしいから丸々消してやろうかとも思ったんですが、もしかしたら同じ事考える私みたいな初心者がいたら1pxくらいは役に立つかなと思ってdel消しで残しますね。
結論としては、elseif文を書いたからといって、elseは必ずしも入れなくてはいけないわけではありません。elseとelseifはどちらもif文の拡張機能なので書いても書かなくてもOKです。
と、こちらのサイトに書いてありました。
PHPスクリプト講座:elseif -- そふぃのphp入門
マニュアルの elseif のページには書いてなかったのに。もっと早くこのページに出会いたかったぜ。小一時間悩んだ。
今回のパスワード関連を追加したソース全文
上の件での怪しさも解消されたので、ここまでの全文。だんだん行数が増えてきたから前回までに書いてたコメントは消しました。
<< 簡単なお知らせを表示する(3)補足 勉強メモ | 簡単なお知らせ ソースのアドバイス頂いた! >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/210
コメント (2)
ここまで見ててちょっと気になりましたのでコメントを。。
file_put_contentsなんていう便利な関数があります
http://php.benscom.com/manual/ja/function.file-put-contents.php
!($pass == $password)は
$pass != $passwordのほうがいいような
$subject = @$_POST["subject"];
この@はおまじないではなくてエラーが出た場合スルーするといった意味になります
そしてこれの動作は遅いのでphpで使用はあまり勧められていません
$subject = isset($_POST["subject"])? $_POST["subject"] : null;
こんな風にしたほうがいい気がします。
あとタイトルでエラーがなかった場合に内部エラーが出てる気がしますよ!
投稿者: Redsnow | 2009年01月26日 12:03
>Redsnowさん
ありがとうございますーー!!
アドバイス、すごい勉強になりました(n' ω 'n)
さっそくお教え頂いた内容を元に修正してみました。
http://redline.hippy.jp/lab/php/post_49.php
ほんとに感謝感謝です。
ありがとうございましたー!
投稿者: Red | 2009年01月26日 14:51