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

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

ただいまの
回答率

88.80%

*htmlの空のテキストボックスのvalueには何が入っているのですか?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,481

WeilSpinor

score -34

htmlの空のテキストボックスのvalueには何が入っているのですか?

プログラミング初心者です。
以下の自作のブール値判定プログラム(HTML+PHP。isset、empty、is_nullなどを使った)
により、

「空のテキストボックスの値には、NULLが入っているわけではない」
「テキストボックス内の値をNULLに書き換えても、値がNULLになるわけでもない」
ということはわかりました。
しかし、

・では、空のテキストボックスにはいったい何の値が入っているのか。
・そして、「NULL」と書かれたテキストボックスには、いったい何の値が入っているのか。
・どうすれば以下の命題を実現できるか:
                 「空のテキストボックスをPOST送信すると、スーパーグローバル変数のvalue $_POST["テキストボックスのname"] に、nullが代入される」

がわかりません。(PHPマニュアルのisset関数等の項目を見ましたが、よくわかりませんでした)
もしよろしければ、教えていただけますでしょうか?
ご回答宜しくお願いします。

ブール値判定プログラム

<!--このHTMLのファイル名は、「fileMethod.html」です-->

<tr>ここでisset、empty、is_nullの挙動を確認しよう</tr>
<tr>
    <form method="post" action="fileMethod.php" >
        issetの引数:
        <input name="issetInput" type="text"><br>
        emptyの引数:
        <input name="emptyInput" type="text"><br>
        is_nullの引数:
        <input name="is_nullInput" type="text"><br>

        <input type="submit" value="送信"><br>
    </form>
</tr>
/*このスクリプトのファイル名は、「fileMethod.php」です*/
<?php
/*issetの引数と戻り値について*/
echo "isset関数は、渡された変数が、存在していてかつ中身がnullでないならばtrueを返し、それ以外ならば、つまり存在しないか中身がnullならばfalseを返すのであった。";
echo "<br>";
echo "isset関数について、引数「";
echo $_POST["issetInput"];
echo "」に対する戻り値は、「";
echo isset($_POST["issetInput"]);
echo "」です。";
echo "<br>";
/*emptyの引数と戻り値について*/
echo "empty関数について、引数「";
echo $_POST["emptyInput"];
echo "」に対する戻り値は、「";
echo empty($_POST["emptyInput"]);
echo "」です。";
echo "<br>";
/*is_nullの引数と戻り値について*/
echo "is_null関数について、引数「";
echo $_POST["is_nullInput"];
echo "」に対する戻り値は、「";
echo is_null($_POST["is_nullInput"]);
echo "」です。";
echo "<br><br>";

echo "以上の結果から、「空のテキストボックスの中身(value)はnullではない」ということが分かるんだ。";

?>

追記

テキストボックスの値は、中身がなんであるかによらず、あくまで常に文字列として記録される、ということがわかりました。
よく覚えておきます。

ちなみに、頂いたアドバイス通りに、条件分岐を==を使って以下のように書き替えたところ、目的通りのモジュールを完成できました。(もう一つのやり方をおしえて頂いた方も、ありがとうございます。参考にさせていただきます)

<?php
/*テキストボックスに入力された名前のファイルを作成*/
if($_POST["fNameCr"] == true){//テキストボックスの入力が空でなければ実行
    touch("{$_POST['fNameCr']}");//名前が"○○"のファイルを作成(○○はfNameのvalue。作成場所はこのスクリプトと同ディレクトリ)
    echo "ファイル「{$_POST['fNameCr']}」の作成に成功しました!\n";
}else{//テキストボックスの入力が空ならば実行
    echo "ファイル名が入力されていません。戻って入力してください。";
};
?>

ついでに

==と===の違いについて

等価判定演算子==の機能は、
「左側の値を、そのデータ型を右側の値のデータ型と同じデータ型へ変換を施した後、右側の値との等価判定を実行する」

等価判定演算子===の機能は、
「左側の値を、ただ単に、右側の値との等価判定を実行する」

という感じであっているでしょうか?もしよろしければ、ご回答頂けると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2019/03/22 17:49

    なぜ「nullが代入される」必要があるのでしょう。

    キャンセル

  • WeilSpinor

    2019/03/22 18:00 編集

    まず、isset関数を使って、
    「テキストボックスに値が入力されていたら処理Aを行い、値が入力されていなければ処理Bを実現する」
    というモジュールを作りたいと思っていました。以下の感じです:

    if(isset($_POST["テキストボックスのname"])){
    //処理A
    }else{
    //処理B
    };

    これが狙い通りに動くためには、
    「テキストボックスが空でない時は、変数 isset($_POST["テキストボックスのname"])がtrue」
    「テキストボックスが空の時は、変数 isset($_POST["テキストボックスのname"])がfalse」
    である必要があります。

    しかし、うまく動かず、テキストボックスが空でも処理Aを実行してしまいました。

    そこで
    「isset関数の使い方を勘違いしているのかもしれない」
    と思い、PHPマニュアルで調べてみたところ、
    「isset関数は、引数に渡される変数が存在していてかつ値null以外の値が入っていればtrueを、値がnullならばfalseを返す。」
    とあったので、
    「ならば、HTMLのテキストボックスやHTTPリクエストの仕様の問題なのかもしれない」
    ということを疑っています。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/03/22 19:52

    var_dump() を知らないのかな???

    キャンセル

回答 5

+4

では、空のテキストボックスにはいったい何の値が入っているのか。

''(空文字列)

そして、「NULL」と書かれたテキストボックスには、いったい何の値が入っているのか。

'NULL'(「NULL」という文字列)

どうすれば以下の命題を実現できるか(後略)

なんのために実現したいのでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/22 18:47

    ありがとうございます。
    一つ気になったのですが、

    ===は「データ型の違いも含んだ等価判定」ですよね?

    今回は、「テキストボックスの見た目の中身を、無理矢理しょうみのブール値として解釈させたい」ので、
    データ型の違いを無視しなければいけませんから、===ではなく、

    ==でないといけなくないでしょうか?

    現に、===だと、入力したテキストによらず常にfalseになってしまい、==だと目的通りに動いてくれました。

    キャンセル

  • 2019/03/22 18:51

    すみません、間違えて連投してしまいました。

    キャンセル

  • 2019/03/22 20:18

    「データ型の違いも含ん」で、''と比較する必要があります。

    キャンセル

+3

こんな感じになりますかね。

if (isset($_POST['foo'])) {
  // fooというパラメータを受信した
  if ($_POST['foo'] === '') {
    // fooというパラメータを受信したものの、空文字列だった(テキストエリアで未入力など)
  }
  else {
    // fooというパラメータを受信して、値が入っていた
  }
}
else {
  // fooというパラメータを受信してない(もしかしてフォーム上でパラメータ名を間違ったかも)
}


こんなサンプルコードのように、
true or false でジャッジできる2択の状況ではなく、むしろ3択なので、
ブール値で判定結果を返すことが無理です。

NULLはヌルという特別な状態を示すための、null型の値です。
null型はNULLしか値が存在しません。
0でもなければ''(空文字列、文字列長ゼロの文字列)でもありません。
変数がNULLの場合というのは、そもそもその変数が定義されていない存在しないことを示します。
PHP: NULL - Manual
つまり、「NULLという値を納めている変数が存在する」のではなく
「そんな変数は定義されていないし存在もしていない」ってことになるかと。

併せてこちらも読むと良いかも:
PHP isset, empty, is_null の違い早見表 - Qiita

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/22 19:02

    ご回答ありがとうございます。
    思わぬ所でnullの理解を深めるきっかけになりました。

    キャンセル

  • 2019/03/22 19:17 編集

    phpの、いいのかわるいのかわかりにくい特徴の一つが、自動型変換機能です。
    PHP: 型の相互変換 - Manual
    http://jp2.php.net/manual/ja/language.types.type-juggling.php
    値を比較するとき、演算するとき、示したページのように勝手に数値として解釈してしまうため、
    思わぬところで意図しない処理や判断をしかねません。
    明示的に intvar() とか floatvar() をつかうこともあります。余談。

    キャンセル

checkベストアンサー

+2

既に回答があり、解決済みかと思いますが、理解されてなさそうな箇所を補足します。
(私の説明に誤りがご指摘ください)

テキストボックスの値について

テキストボックスのスーパーグローバル変数(のvalue)に代入されるのは、あくまでテキストボックスの"文字列"なんですね。

既に理解されているとおりで、テキストボックスは入力しても、入力しなくても、スーパーグローバル変数で取得する型は全て文字列です。

テキストボックスに ああああ と入力すれば、'ああああ' という文字列を取得します。
テキストボックスに NULL と入力すれば 'NULL' という文字列を取得します。
テキストボックスに true と入力すれば 'true' という文字列を取得します。
何も入力しなければ、'' 空の文字列を取得します。

ちなみに、何の型か知りたいときは、var_dump を使います。
例えばですが、下記のように型を知ることができます。

<?php
$a = 'おはよう';
var_dump($a);

出力結果は下記です。

string(12) "おはよう"

string とあるので、文字列型とわかります。

ちなみに、PHPの実行結果を簡単に見たいときは、Online PHP editor などのオンラインエディタを使うとブラウザ上で確認できます。

if の条件式について、== と === の違い

if で条件分岐をするには、何が true と評価されて、何が false と評価されるのか理解しておく必要があります。
true と false は論理型で、それぞれの値を論理値と呼びます。
※ PHP は truefalse の大文字・小文字は区別しませんので、この記事では小文字で統一します。

if の基本的な記述は下記のとおりです。

if(条件式) {
    // true と評価されたらここの処理を実行
}

条件式の記述ですが、わかりやすいのが 比較演算子 を使った記述です。
リンク先のPHPマニュアルにも記載されていますが、== や === の比較演算子は二つの値を比較して、true か false かを返します。

あえて、== の緩やかな比較を使ってみます。

if('テスト' == 'テスト') {
  echo '条件が一致しています';
}

二つの値は同じですので、true となり、条件が一致しています と表示されます。
次の場合はどうでしょうか。

if('テスト' == true) {
  echo '条件が一致しています';
}

条件が一致しています と表示されます。
なぜ、等しいと判断されるかと言うと == の緩やかな比較を使っているため、型の相互変換が行われるためです。

$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 "<hr>\n";
}

PHP: 論理型 (boolean) - Manual

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/25 19:15 編集

    ご回答ありがとうございます。

    マニュアルには、==の『型の相互変換』は、文字列型と数値型を比較した場合、文字列型の方の値が数値型に変換されて比較される、とありました。
    その場合、おそらく、例えば文字列'3'は数値3(文字コード番号と一致)に変換され、文字列'こんにちは'は、各文字の文字コードの番号(の10進数バージョン)を繋げた数値に変換される、
    という事だと思います。

    そこで、確認したいのですが、

    ・==の『型の相互変換』は文字列型の値とブール型を比較した場合、文字列型の方がブール型に変換されて比較される。(つまり、相互変換においては、文字列型よりもブール型の方が"強い")

    ・==は、文字列型と文字列型、つまり同じ型同士の値を比較した場合は、「両者ともにブール型に変換して」比較が行われる。
    (でないと、文字列のゼロ'0'と空文字列''が等しいと判定される説明ができない)

    こういうことで合っているでしょうか?

    キャンセル

  • 2019/03/25 19:21

    つまり、


    【異なる型の値同士の場合】
    型の相互変換には『方向』があって、
    「文字列型→数値型→ブール型」
    となる。
    【文字列同士の場合】
    型の相互変換は、両者ともに問答無用でブール型に変換されて比較される。
    【数値同士の場合】
    型の相互変換は行われず、数値のまま比較される。

    という感じでしょうか?

    キャンセル

  • 2019/03/26 02:24 編集

    > 文字列型と数値型を比較した場合、文字列型の方の値が数値型に変換されて比較される、とありました。
    > 例えば文字列'3'は数値3(文字コード番号と一致)に変換され、

    文字列型の方の値が数値型に変換されますが、文字コードは関係ないと思います。
    PHPが何の値と何の値を比較しているかです。
    実際に試してみてほしいのですが、文字列 '3' を整数型に型キャストしてみます。

    ```php
    var_dump((int)'3');
    ```

    ```
    int(3)
    ```

    文字列の '3' を整数型に型キャストすると、整数型の 3 になりました。
    ですので、'3' == 3 と比較すると文字列の '3' は整数型にキャストされ、整数型の 3 と整数型の 3 を比較し、true となります。

    > 文字列'こんにちは'は、各文字の文字コードの番号(の10進数バージョン)を繋げた数値に変換される、という事だと思います。

    文字コードの番号を繋げた数値に変換されるというのは誤解です。
    `==` の場合、比較するときに勝手に型キャストして比較しているというだけの話です。
    実際に試してみてほしいのですが、'こんにちは'という文字列と整数型の3を比較してみます。

    ```php
    if('こんにちは' == 3) {
    echo 'trueです';
    } else {
    echo 'falseです';
    }
    ```

    ```
    falseです
    ```

    「falseです」と表示されました。

    比較するときに文字列を整数型に型キャストしてから比較しています。
    'こんにちは'という文字列を整数型に型キャストすると何になるか確認してみます。

    ```php
    var_dump((int)'こんにちは');
    ```

    ```
    int(0)
    ```

    整数型の 0 です。
    先ほどの if の条件は整数型の 0 と整数型の 3 を比較しているため「falseです」と表示されました。
    整数型の 0 と比較してみましょう。

    ```php
    if('こんにちは' == 0) {
    echo 'trueです';
    } else {
    echo 'falseです';
    }
    ```

    ```
    trueです
    ```

    「trueです」と表示されました。

    比較するときにどちらの型にあわせるかですが、わかりにくいのですが、おそらく「さまざまな型の比較
    https://www.php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.types)」に記載されているとおりかと思います。
    bool なら両方を bool に変換し、数値と文字列なら文字列を数値に変換して比較しているのかと思います。
    (うーん、この表わかりにくいですね...)

    実際に型同士の比較結果は「== による緩やかな比較(https://www.php.net/manual/ja/types.comparisons.php#types.comparisions-loose)」に記載されています。
    ここを見てください。
    TRUE と FALSE の結果に納得いかないところがあれば、先ほどのように実際に自分で試してみてください。
    実際にどちらかの値を型キャストして比較してみれば、どちらの型にあわせているのかわかります。
    ちなみに、先ほど試した文字列と整数型の0の比較も TRUE と記載されています。

    一通り説明してわかったと思いますが、`==` の緩やかな比較はわかりにくいので使わない方がいいです。

    キャンセル

  • 2019/03/26 08:41 編集

    詳しくご説明頂き大変ありがとうございます。また見返したりして、少しずつ覚えていこうと思いm酢z

    キャンセル

+2

まず、isset関数を使って、
「テキストボックスに値が入力されていたら処理Aを行い、値が入力されていなければ処理Bを実現する」
というモジュールを作りたいと思っていました。以下の感じです:

if(isset($_POST["テキストボックスのname"])){
//処理A
}else{
//処理B
};

これが狙い通りに動くためには、
「テキストボックスが空でない時は、変数 isset($_POST["テキストボックスのname"])がtrue」
「テキストボックスが空の時は、変数 isset($_POST["テキストボックスのname"])がfalse」
である必要があります。

しかし、うまく動かず、テキストボックスが空でも処理Aを実行してしまいました。

ただ空かどうかを判別するだけなら empty で判断してください。

【PHP: empty - Manual】
http://php.net/manual/ja/function.empty.php

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

>「空のテキストボックスをPOST送信すると、スーパーグローバル変数の
>value $_POST["テキストボックスのname"] に、nullが代入される」

処理系に依存しそうですが、PHPでは無理じゃないですかね。

nullとカラ文字列を判別したいということであれば、nullとしたいケースで
JavaScript等で送信時にpostから除外するとかで判別できるかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/22 19:11

    ご回答ありがとうございます。
    JavaScriptで送信時にポストから除外…そんなテクニックがあるんですね…。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る