質問: htmlの空のテキストボックスのvalueには何が入っているのですか? プログラミング初心者です。 以下の自作のブール値判定プログラム(HTML+PHP。isset、empty、is_nullなどを使った) により、 **「空のテキストボックスの値には、NULLが入っているわけではない」** **「テキストボックス内の値をNULLに書き換えても、値がNULLになるわけでもない」** ということはわかりました。 しかし、 **・では、空のテキストボックスにはいったい何の値が入っているのか。** **・そして、「NULL」と書かれたテキストボックスには、いったい何の値が入っているのか。** **・どうすれば以下の命題を実現できるか:** **「空のテキストボックスをPOST送信すると、スーパーグローバル変数のvalue $_POST["テキストボックスのname"] に、nullが代入される」** がわかりません。(PHPマニュアルのisset関数等の項目を見ましたが、よくわかりませんでした) もしよろしければ、教えていただけますでしょうか? ご回答宜しくお願いします。 ### ブール値判定プログラム ``` ここでisset、empty、is_nullの挙動を確認しよう issetの引数: emptyの引数: is_nullの引数: ``` ``` /*このスクリプトのファイル名は、「fileMethod.php」です*/ "; echo "isset関数について、引数「"; echo $_POST["issetInput"]; echo "」に対する戻り値は、「"; echo isset($_POST["issetInput"]); echo "」です。"; echo ""; /*emptyの引数と戻り値について*/ echo "empty関数について、引数「"; echo $_POST["emptyInput"]; echo "」に対する戻り値は、「"; echo empty($_POST["emptyInput"]); echo "」です。"; echo ""; /*is_nullの引数と戻り値について*/ echo "is_null関数について、引数「"; echo $_POST["is_nullInput"]; echo "」に対する戻り値は、「"; echo is_null($_POST["is_nullInput"]); echo "」です。"; echo ""; echo "以上の結果から、「空のテキストボックスの中身(value)はnullではない」ということが分かるんだ。"; ?> ``` ### 追記 テキストボックスの値は、中身がなんであるかによらず、あくまで常に文字列として記録される、ということがわかりました。 よく覚えておきます。 ちなみに、頂いたアドバイス通りに、条件分岐を==を使って以下のように書き替えたところ、目的通りのモジュールを完成できました。(もう一つのやり方をおしえて頂いた方も、ありがとうございます。参考にさせていただきます) ``` ``` ### ついでに ==と===の違いについて 等価判定演算子==の機能は、 「左側の値を、そのデータ型を右側の値のデータ型と同じデータ型へ変換を施した後、右側の値との等価判定を実行する」 等価判定演算子===の機能は、 「左側の値を、ただ単に、右側の値との等価判定を実行する」 という感じであっているでしょうか?もしよろしければ、ご回答頂けると幸いです。
回答: 既に回答があり、解決済みかと思いますが、理解されてなさそうな箇所を補足します。 (私の説明に誤りがご指摘ください) テキストボックスの値について ============== > > テキストボックスのスーパーグローバル変数(のvalue)に代入されるのは、あくまでテキストボックスの"文字列"なんですね。 > > > 既に理解されているとおりで、テキストボックスは入力しても、入力しなくても、スーパーグローバル変数で取得する**型は全て文字列**です。 テキストボックスに `ああああ` と入力すれば、`'ああああ'` という文字列を取得します。 テキストボックスに `NULL` と入力すれば `'NULL'` という文字列を取得します。 テキストボックスに `true` と入力すれば `'true'` という文字列を取得します。 何も入力しなければ、`''` **空の文字列**を取得します。 ちなみに、何の型か知りたいときは、var_dump を使います。 例えばですが、下記のように型を知ることができます。 ``` > $a == $b 等しい **型の相互変換**をした後で $a が $b に等しい時に TRUE。 > > > PHP: 比較演算子 - Manual > > > 今回の場合、`'テスト'`という文字列が `true` か `false` の論理値に変換されます。 何が `true` で何が `false` と判断されるかはPHPマニュアルに記載されています。 下記が `false` と判断され、**それ以外は `true` と判断されます。** > > boolean に変換する場合、次の値は FALSE とみなされます。 > > > boolean の FALSE > > integer の 0 (ゼロ) > > float の 0.0 (ゼロ) > > 空の文字列、 および文字列の "0" > > 要素の数がゼロである 配列 > > 特別な値 NULL (値がセットされていない変数を含む) > > 空のタグから作成された SimpleXML オブジェクト > > > 引用:PHP: 論理型 (boolean) - Manual > > > 上記に `'テスト'`という文字列はありませんので、`'テスト'` は `true` と判断されます。 ですので、`条件が一致しています` と表示されたというわけです。 当然ですが、`===` の厳密な比較だと結果は異なります。 > > $a === $b 等しい $a が $b に等しく、および同じ型である場合に TRUE 。 > > > PHP: 比較演算子 - Manual > > > 緩やかな比較とは違い、型変換はしません。 ``` if('テスト' === true) { echo '条件が一致しています'; } else { echo '条件は一致しません'; } ``` `条件は一致しません` と表示されます。 そもそも、文字列型と論理型で型が違いますので当然です。 これが `==` と `===` の違いです。 `==` の緩やかな比較は、型変換されて何が `true` を返すのか、`false` なのかわかりにくいので、`===` を使った方がいいです。 if の条件式には論理値以外も記述できる ==================== `if` の条件式には論理値(`true` か `false`)だけではなく、文字列や数値なども記述することができます。 下記のように文字列を記述できます。 ``` if('おはよう') { echo 'trueです'; } else { echo 'falseです'; } ``` `trueです` と表示されます。 不思議に思うかもしれませんが、`if` の条件式は**論理値で評価されます。** > > 式は論理値で評価されます。 > > > PHP: if - Manual > > > `'おはよう'` は `true` なのか `false` なのか判断します。 この基準は先ほど説明したとおりで、PHPマニュアルに記載されてたものは `false` で、それ以外は、`true` と判断されます。 そのため、`'おはよう'` は `true` と判断されます。 ここまで理解したら、本題に入ります。 テキストボックスの入力の有無で条件分岐する方法 ======================= テキストボックスの入力がないときは `''` 空文字です。 テキストボックスの入力の有無によって条件分岐をしたければ、単純に `''` 空文字と比較すればいいだけです。 ``` if($_POST["example"] === '') { // テキストボックスの入力がないときの処理 } else { // テキストボックスに入力があったときの処理 } ``` 最初にテキストボックスに入力があったときの処理をしたければ、等しくないか比較すればいいだけです。 ``` if($_POST["example"] !== '') { // テキストボックスに入力があったときの処理 } else { // テキストボックスの入力がないときの処理 } ``` maisumakun さんが `==` ではなく `===` を使うようにとアドバイスした理由は既に理解さていると思いますが説明します。 下記のように記述したとします。 ``` if($_POST["example"] == '') { // テキストボックスの入力がないときの処理 } else { // テキストボックスに入力があったときの処理 } ``` `==` は勝手に型変換されて比較されます。 `false` と判断されるのは下記です。 > > boolean に変換する場合、次の値は FALSE とみなされます。 > > > boolean の FALSE > > integer の 0 (ゼロ) > > float の 0.0 (ゼロ) > > **空の文字列、 および文字列の "0"** > > 要素の数がゼロである 配列 > > 特別な値 NULL (値がセットされていない変数を含む) > > 空のタグから作成された SimpleXML オブジェクト > > > 引用:PHP: 論理型 (boolean) - Manual > > > 文字列の `'0'` も `false` と判断されてしまいます。 緩やかな比較の場合、テキストボックスに `0` と入力しても、入力されていないという処理になってしまうため、厳密な比較 `===` を使いましょうとアドバイスをしていたわけです。 ちなみにですが、追記された下記の条件式は冗長です。 ``` if($_POST["fNameCr"] == true){ // 略 }else{ // 略 }; ``` 既に理解されていると思いますが、`if` には論理型以外を記述しても論理値にして判断します。 ですので、先ほどの記述は下記と同じです。 ``` if($_POST["fNameCr"]){ // 略 }else{ // 略 }; ``` `==` の**緩やかな比較**を使って `true` と比較しているため、その必要がないということです。 そのことは、PHPマニュアルにも記載されています。 > > // これは冗長 > > if ($show_separators == TRUE) { > > echo "\n"; > > } > > > PHP: 論理型 (boolean) - Manual > > >