htmlspecialcharsの連続はイヤーーーーーー!!!
大変失礼いたしました。当然のように進むので言うに言えず
ブログで叫んでしまいました
昨日ご紹介の通り、本日からtwitterもどきの作成です。
授業としては会員情報の登録、sessionとmysqlの登録まで進みました。
そんなことはどうでもよくて
テキスト準拠ではあるのですが、どーにも書き方が解せませぬ。
かといって自分の書き方に自信がない
というわけで、それぞれのコードの紹介です。
実際の作成ではなくて、書き方をあわせたものになります。
まずこちら。
<?php //noticeのエラーを非表示に error_reporting(E_ALL & ~E_NOTICE); if(!empty($_POST)){ $errMsg=[]; //未入力チェック。 if($_POST['name']==''){ $errMsg['name'] = 'blank'; } if($_POST['email']==''){ $errMsg['email'] = 'blank'; } if($_POST['password']==''){ $errMsg['password'] = 'blank'; } //登録処理 if(empty($errMsg)){ echo '<h1>登録するよ!</h1>'; //header('Location : check.php'); } } echo 'ポストの中身' . var_dump($_POST) . "<br>"; ?> <!DOCTYPE html> <html> <head> <title>登録テスト</title> <meta charset="UTF-8"> <style> .err{ color:red; } </style> </head> <body> <div>会員登録</div> <form action="" method="post"> Name:<input type="text" name="name" placeholder="name" value="<?php echo htmlspecialchars($_POST['name'],ENT_QUOTES,'UTF-8'); ?>"><br> <?php if($errMsg['name']=='blank'): ?> <p class="err">*名前を入力してください。</p> <?php endif; ?> Email:<input type="text" name="email" placeholder="email" value="<?php echo htmlspecialchars($_POST['email'],ENT_QUOTES,'UTF-8'); ?>"><br> <?php if($errMsg['email']=='blank'): ?> <p class="err">*メールアドレスを入力してください。</p> <?php endif; ?> password:<input type="text" name="password" placeholder="password" value="<?php echo htmlspecialchars($_POST['password'],ENT_QUOTES,'UTF-8'); ?>"><br> <?php if($errMsg['password']=='blank'): ?> <p class="err">*パスワードを入力してください。</p> <?php endif; ?> <br> <input type="submit" value="登録"> </form> </body> </html>
実行結果です。
フォーム部品がたった3つしかないのにめちゃくちゃゴチャゴチャしてます
3回もhtmlspecialcharsと書くあたりは流石に疑問に思ってもよいと思います。
それでわたしなりに変更したのがこっち。
<?php //こっちはnotice非表示ひつようなし。 //error_reporting(E_ALL & ~E_NOTICE); function h($s){ return htmlspecialchars($s,ENT_QUOTES,"UTF-8"); } function ev($s){ echo var_dump($s).'<br>'; } //入力項目を定義 $req =['name','email','password']; //エラーメッセージを初期化 foreach ($req as $val){ $errMsg[$val] = ''; } //ポストが存在すれば格納、なければblank foreach ($req as $val){ if(!isset($_POST[$val])){ $p[$val] = ''; }else{ $p[$val] =h($_POST[$val]); } } if($_SERVER['REQUEST_METHOD']=='POST'){ //未入力チェック。 if($p['name']==''){ $errMsg['name'] = sprintf('<p class=err>%s</p>',"*名前を入力してください。"); } if($p['email']==''){ $errMsg['email'] = sprintf('<p class=err>%s</p>',"*メールを入力してください。"); } if($p['password']==''){ $errMsg['password'] = sprintf('<p class=err>%s</p>',"*パスワードを入力してください。"); } //エラーチェック $isErr = false; foreach($errMsg as $key => $val){ if($val!=""){ $isErr=true; } } //登録処理 if(!$isErr){ echo '<h1>登録するよ!</h1>'; //header('Location : check.php'); } } echo 'ポストの中身'; ev($_POST); ?> <!DOCTYPE html> <html> <head> <title>登録テスト</title> <meta charset="UTF-8"> <style> .err{ color:red; } </style> </head> <body> <div>会員登録</div> <form action="" method="post"> Name:<input type="text" name="name" placeholder="name" value="<?= $p['name'] ?>"><br> <?= $errMsg['name'] ?> Email:<input type="text" name="email" placeholder="email" value="<?= $p['email'] ?>"><br> <?= $errMsg['email'] ?> password:<input type="text" name="password" placeholder="password" value="<?= $p['password'] ?>"><br> <?= $errMsg['password'] ?> <br> <input type="submit" value="登録"> </form> </body> </html>
関数があるので行数は増えるものの、html部分がとてもすっきり!
以下が変更箇所です。それはよくないとゆーとこがあったら教えてください!
定番のh関数
これはさすがに・・・
var_dumpもめんどい
ev()という謎関数を作成
$_POSTって書くのがいや
アンダーバー+大文字は打つの大変なんです。しかもほっとくと頻出。
$pに一旦全部うけてしまってます。
$reqで登録予定のフォームをあらかじめ定義
個人的に空白だと$_POSTの部品ごと送られてこないことに納得がいきません。
最初からblankつっこんじゃいます。
テキスト通りだと似たようなフォーム作るたびに血を吐きます。
こうしておけばいくらか楽だと思うのですが……いかがでしょう?