質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

!emptyが実行される条件

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 199

LEMON_

score 12

前提

udemyで勉強していて思った通りにコードは動くのですが、分からない点があったので質問させていただきます。

発生している問題・エラーメッセージ

!emptyをページを呼び出した時にエラーコードが最初から出ないように指定しています。
ですが、フォーム送信時が空だった場合はエラーコードが出現します。
この違いは何なのでしょうか…

該当のソースコード

<?php
if (!empty($_POST)) {
    if ($_POST["name"] === "") {
        $error["name"] = "blank";
    }
    if ($_POST["email"] === "") {
        $error["email"] = "blank";
    }
    if (strlen($_POST["password"]) < 4) {
        $error["password"] = "length";
    }
    if ($_POST["password"] === "") {
        $error["password"] = "blank";
    }
    if (empty($error)) {
        header("Location: check.php");
        exit();
    }
}
?>

<body>
    <div id="wrap">
        <div id="content">
            <p>次のフォームに必要事項をご記入ください。</p>
            <form action="" method="post" enctype="multipart/form-data">
                <dl>
                    <dt>ニックネーム<span class="required">必須</span></dt>
                    <dd>
                        <input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST["name"], ENT_QUOTES)); ?>" />
                        <?php if ($error["name"] === "blank") : ?>
                            <p class="error">*ニックネームを入力してください</p>
                        <?php endif; ?>
                    </dd>
                    <dt>メールアドレス<span class="required">必須</span></dt>
                    <dd>
                        <input type="text" name="email" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST["email"], ENT_QUOTES)); ?>" />
                        <?php if ($error["email"] === "blank") : ?>
                            <p class="error">*メールアドレスを入力してください</p>
                        <?php endif; ?>
                    <dt>パスワード<span class="required">必須</span></dt>
                    <dd>
                        <input type="password" name="password" size="10" maxlength="20" value="<?php print(htmlspecialchars($_POST["password"], ENT_QUOTES)); ?>" />
                        <?php if ($error["password"] === "length") : ?>
                            <p class="error">*パスワードは4文字以上で入力してください</p>
                        <?php endif; ?>
                        <?php if ($error["password"] === "blank") : ?>
                            <p class="error">*パスワードを入力してください</p>
                        <?php endif; ?>
                    </dd>
                    <dt>写真など</dt>
                    <dd>
                        <input type="file" name="image" size="35" value="test" />
                    </dd>
                </dl>
                <div><input type="submit" value="入力内容を確認する" /></div>
            </form>
        </div>
</body>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/03/23 23:21 編集

    この場合の「エラーコード」とはなんのことでしょうか。

    キャンセル

  • m.ts10806

    2020/03/23 23:22

    empty() のPHPマニュアルは確認されましたか?

    キャンセル

  • LEMON_

    2020/03/24 00:35

    この場合のエラーコードとは、$errorのことのことを指しています。

    キャンセル

  • m.ts10806

    2020/03/24 05:55

    誰も$errorのこととは認識しないと思います。
    それは単なる変数です。
    「エラーコード」というと一般的には言語側が自動的に出力する情報のことをイメージされます。
    質問を編集して表現調整しておいてください。

    キャンセル

回答 2

checkベストアンサー

+1

冒頭でvar_dump($_POST);実行してみれば分かるのではないでしょうか。
「フォーム送信時が空だった場合」という表現が非常に分かりづらいのですが「未入力の場合」だったとしましょう。

それぞれ「各項目が空文字」で送信されているはずです。

つまりこういう状態

[
   'name'=>'',
   'email'=>''
]

この時点で!empty()はtrueになりますよね。空ではないから。

もし分かりにくいというのでしたら、$_POSTの中身確認するのではなく、そもそものサーバーリクエストをチェックすると良いですよ。

if($_SERVER['REQUEST_METHOD']==='POST'){



}


画面に単にアクセスしたときはGETですから、このifの中には入りません。
$_POSTにempty()かけるより直観的です。

あとは$_POSTを直接参照するのではなくfilter_input()を利用された方が良いです。
(調べると有用性を説明した記事は沢山出てきます)

後はエラー有無のチェック。
ここもemptyは微妙ではないでしょうか。
初期値宣言しておいて、countのほうが合ってる気がします(empty()でも確かに通るのは通るけど、配列としてチェックした方がコードの統一性とれそうな気がします)。

if($_SERVER['REQUEST_METHOD']==='POST'){
    $error = [];
    $name = filter_input(INPUT_POST,'name');
    if(is_null($name) || $name === '' ){
        $error["name"] = "blank";
    }

//中略

    if(count($error) === 0){
        header("Location: check.php");
        exit();
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/24 02:52

    ありがとうございます。
    [
    'name'=>'',
    'email'=>''
    ]
    がtrueになる理由がわかりました。
    そして今のコードよりも良い書き方を教えていただき感謝です。

    無知で申し訳ないのですが、「画面に単にアクセスしたときはGETですから、このifの中には入りません」
    という点の理解が難しいです…

    キャンセル

  • 2020/03/24 05:52

    echo $_SERVER['REQUEST_METHOD'];

    してみてください。

    キャンセル

  • 2020/03/24 15:12

    ページを呼び出したときはGET、フォーム送信時はPOSTだからif($_SERVER['REQUEST_METHOD']==='POST')と指定すればよい、という理由分かりました。ありがとうございます。
    PHPの勉強初めて日が浅く$POSTの中身チェック、filter_input()、エラー有無のチェックなどは完ぺきに理解することは難しかったのである程度勉強できたあとまた見に来ようと思います。
    ありがとうございました。

    キャンセル

  • 2020/03/24 16:10

    呼び出したときは
    うーん、そうですね正確な表現が難しいですが、「POST送信以外は」としたほうが良いかもしれません。
    リダイレクトもGETなので。

    まあ各種チェックについてはひとつずつやっていきましょう。
    filter_inputもオプションがたくさんありますが、PHPマニュアル読みながらそこにあるサンプルコードを自分でも試しながら理解を深めていくと良いです。

    キャンセル

+1

!emptyが実行される条件

タイトルに関して回答します。

PHP 型の比較表 の「PHP 関数による $x の比較」にまとまっています。

!なので、TRUE/FALSE が逆転します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる