なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

職業訓練の授業51日目~会員登録画面の作成~

f:id:nazuna_0124:20170310221050p:plain

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>


実行結果です。

f:id:nazuna_0124:20170322203018p:plain


フォーム部品がたった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つっこんじゃいます。



テキスト通りだと似たようなフォーム作るたびに血を吐きます。


こうしておけばいくらか楽だと思うのですが……いかがでしょう?