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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

963閲覧

!emptyが実行される条件

LEMON_

総合スコア17

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/03/23 14:19

前提

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

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

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

該当のソースコード

php

1<?php 2if (!empty($_POST)) { 3 if ($_POST["name"] === "") { 4 $error["name"] = "blank"; 5 } 6 if ($_POST["email"] === "") { 7 $error["email"] = "blank"; 8 } 9 if (strlen($_POST["password"]) < 4) { 10 $error["password"] = "length"; 11 } 12 if ($_POST["password"] === "") { 13 $error["password"] = "blank"; 14 } 15 if (empty($error)) { 16 header("Location: check.php"); 17 exit(); 18 } 19} 20?> 21 22<body> 23 <div id="wrap"> 24 <div id="content"> 25 <p>次のフォームに必要事項をご記入ください。</p> 26 <form action="" method="post" enctype="multipart/form-data"> 27 <dl> 28 <dt>ニックネーム<span class="required">必須</span></dt> 29 <dd> 30 <input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST["name"], ENT_QUOTES)); ?>" /> 31 <?php if ($error["name"] === "blank") : ?> 32 <p class="error">*ニックネームを入力してください</p> 33 <?php endif; ?> 34 </dd> 35 <dt>メールアドレス<span class="required">必須</span></dt> 36 <dd> 37 <input type="text" name="email" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST["email"], ENT_QUOTES)); ?>" /> 38 <?php if ($error["email"] === "blank") : ?> 39 <p class="error">*メールアドレスを入力してください</p> 40 <?php endif; ?> 41 <dt>パスワード<span class="required">必須</span></dt> 42 <dd> 43 <input type="password" name="password" size="10" maxlength="20" value="<?php print(htmlspecialchars($_POST["password"], ENT_QUOTES)); ?>" /> 44 <?php if ($error["password"] === "length") : ?> 45 <p class="error">*パスワードは4文字以上で入力してください</p> 46 <?php endif; ?> 47 <?php if ($error["password"] === "blank") : ?> 48 <p class="error">*パスワードを入力してください</p> 49 <?php endif; ?> 50 </dd> 51 <dt>写真など</dt> 52 <dd> 53 <input type="file" name="image" size="35" value="test" /> 54 </dd> 55 </dl> 56 <div><input type="submit" value="入力内容を確認する" /></div> 57 </form> 58 </div> 59</body>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/03/23 14:21 編集

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

2020/03/23 14:22

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

2020/03/23 15:35

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

2020/03/23 20:55

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

回答2

0

!emptyが実行される条件

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

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

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

投稿2020/03/23 21:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

つまりこういう状態

php

1[ 2 'name'=>'', 3 'email'=>'' 4] 5

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

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

PHP

1if($_SERVER['REQUEST_METHOD']==='POST'){ 2 3 4 5}

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

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

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

php

1if($_SERVER['REQUEST_METHOD']==='POST'){ 2 $error = []; 3 $name = filter_input(INPUT_POST,'name'); 4 if(is_null($name) || $name === '' ){ 5 $error["name"] = "blank"; 6 } 7 8//中略 9 10 if(count($error) === 0){ 11 header("Location: check.php"); 12 exit(); 13 } 14} 15

投稿2020/03/23 14:40

編集2020/03/23 14:41
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LEMON_

2020/03/23 17:52

ありがとうございます。 [ 'name'=>'', 'email'=>'' ] がtrueになる理由がわかりました。 そして今のコードよりも良い書き方を教えていただき感謝です。 無知で申し訳ないのですが、「画面に単にアクセスしたときはGETですから、このifの中には入りません」 という点の理解が難しいです…
m.ts10806

2020/03/23 20:52

echo $_SERVER['REQUEST_METHOD']; してみてください。
LEMON_

2020/03/24 06:12

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

2020/03/24 07:10

呼び出したときは うーん、そうですね正確な表現が難しいですが、「POST送信以外は」としたほうが良いかもしれません。 リダイレクトもGETなので。 まあ各種チェックについてはひとつずつやっていきましょう。 filter_inputもオプションがたくさんありますが、PHPマニュアル読みながらそこにあるサンプルコードを自分でも試しながら理解を深めていくと良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問