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

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

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

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

Q&A

解決済

2回答

812閲覧

filter_inputの動作

gsuisk

総合スコア72

PHP

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

0グッド

1クリップ

投稿2018/09/18 21:30

filter_inputのマニュアルを参照すると、以下は同等の動作をすることがわかります。

PHP

1$name = filter_input(INPUT_POST, 'name');

PHP

1if (!isset($_POST['name'])) { 2 $name = null; 3} elseif (!is_string($_POST['name'])) { 4 $name = false; 5} else { 6 $name = $_POST['name']; 7}

成功した場合は要求された変数の値、フィルタリングに失敗した場合に FALSE、 あるいは変数 variable_name が設定されていない場合に NULL を返します。

(1) 文字列でない!is_string($_POST['name'])ことはフィルタリング失敗を意味するのですか?なぜですか?GETやPOSTは文字列しか送信できないということでしょうか。

(2) 変数が設定されていない(未定義)場合はNULLを返すとあります。
!isset($_POST['name'])がTRUEになるのは、未定義もしくはNULLの場合なので、$_POST['name']がNULLの場合もNULLを返すはずです。

「設定されていない、またはNULLの場合にNULL を返します」としないのはなぜですか?

そもそも外部からの入力を格納した変数がNULLになる場合が存在しないからでしょうか。

細かいことですが教えていただけると助かります。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/18 22:26

つ 配列
guest

回答2

0

POSTの代わりにGETにした以下のスクリプトで説明します。POSTでも動作は同じです。

<?php $name = filter_input(INPUT_GET, 'name'); var_dump($name);

まずは通常系

/filter_input.php?name=abc ↓ string(3) "abc"

空文字列

/filter_input.php?name= ↓ string(0) ""

name=NULL とした場合は、"NULL"という文字列(NULLではない)が返る

/filter_input.php?name=NULL ↓ string(4) "NULL"

数値を指定しても、文字列が返る

/filter_input.php?name=123 ↓ string(3) "123"

name=がない場合は NULL が返る

/filter_input.php?n=123 ↓ NULL

配列を渡す

/filter_input.php?name[]=a&name[]=b ↓ bool(false)

(1) 文字列でない!is_string($_POST['name'])ことはフィルタリング失敗を意味するのですか?なぜですか?GETやPOSTは文字列しか送信できないということでしょうか。

$_GET や $_POST は上記のように文字列(空文字列も含む)か配列を返します。

(2) 変数が設定されていない(未定義)場合はNULLを返すとあります。

!isset($_POST['name'])がTRUEになるのは、未定義もしくはNULLの場合なので、$_POST['name']がNULLの場合もNULLを返すはずです。

$_POST['name'] = NULL; 等と明示的にNULLを代入しない限り、$_POST['name']には、文字列か配列が入ります。例外は、name=という項目がない場合で、この場合はNULLが入ります。

「設定されていない、またはNULLの場合にNULL を返します」としないのはなぜですか?

NULLを明示的に指定する方法がないからです。

そもそも外部からの入力を格納した変数がNULLになる場合が存在しないからでしょうか。

質問の意図が明確に汲み取れませんが、上記の例から推測ください。

投稿2018/09/18 23:47

ockeghem

総合スコア11701

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

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

gsuisk

2018/09/19 11:41

ありがとうございます。 ご提示いただいたコード、非常に参考になりました。 ユーザー側の操作で$_POST['name']がNULLになり得るのは、name=という項目がない場合(未定義)のみなので、「nameが設定されていない」と「$_POST['name']がNULL」は実質同じということですね。
guest

0

ベストアンサー

前提が間違っています。質問にあるコードは、同等ではありません

GET/POST の処理は、以下を一読しておくと良いです。
$_GET, $_POSTなどを受け取る際の処理

(1) 文字列でない!is_string($_POST['name'])ことはフィルタリング失敗を意味するのですか?なぜですか?GETやPOSTは文字列しか送信できないということでしょうか

filter_input が、配列を受け取った場合falseを返す仕様を表しています。

(2) 変数が設定されていない(未定義)場合はNULLを返すとあります。

!isset($_POST['name'])がTRUEになるのは、未定義もしくはNULLの場合なので、$_POST['name']がNULLの場合もNULLを返すはずです。

filter_input は NULL が与えられた場合、FILTER_DEFAULT では `` を返します。

サンプル(めんどいので、filter_var() を使用)

php

1<?php 2$arr = [ 3 NULL, 4 'abc', 5 123, 6 ['hoge','fuga'], 7]; 8foreach ($arr as $key => $val) { 9 $result = filter_var($val); 10 echo 'test:'; 11 var_export($val); 12 echo PHP_EOL.'result:'; 13 var_export($result); 14 echo PHP_EOL.PHP_EOL; 15} 16 17/// 18test:NULL 19result:'' 20 21test:'abc' 22result:'abc' 23 24test:123 25result:'123' 26 27test:array ( 28 0 => 'hoge', 29 1 => 'fuga', 30) 31result:false

余談
スーパーグローバル変数に直接アクセスしない方がいい理由

投稿2018/09/18 22:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gsuisk

2018/09/19 11:12

ありがとうございます。 提示していただいたサンプルを見ると、確かに質問文のコードは同等ではないですね。 貼っていただいたリンクを見ました。質問文に記載したコードに関して等価な処理だと書いてあるのですが、挙動が完全に同じという意味ではないのでしょうか? 記事のこの部分です↓ https://qiita.com/mpyw/items/2f9955db1c02eeef43ea#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E3%81%BF%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B
退会済みユーザー

退会済みユーザー

2018/09/19 11:44

リンク先も User Contributed Notes から参照したんだろうね^^; そもそも、「スーパーグローバル変数に直接アクセスしない方がいい理由」にもあるように、値を拾ってくる元が違うので、等価になりようがないです。 ちなみに「NULL」に関しては、ockeghem さんの回答を参考にしてください。 私の回答の一歩先の回答ですw
gsuisk

2018/09/19 20:54

filter_input()はHTTPで投げられた値(HTTPヘッダにある値)を参照しているのですね。 スーパーグローバル変数について確認してみました。 $_POSTと$_GETの値はstring型、array型、null型しか取らず、数値はstringとして扱われ、未定義はNoticeを出してnullになる。という認識で良いですかね? test.php?a=5 としたとき var_dump($_GET['a']); //string(1) "5" $_POSTの値とHTTPヘッダの値が異なることを踏まえると、質問文の式の結果は等価であると言えませんか? if (!isset($_POST['name'])) { $name = null; } elseif (!is_string($_POST['name'])) { $name = false; } else { $name = $_POST['name']; } 5(int型)を投げた時、$_POST['name']は"5"(string型)となり、最後のelse文が実行される。→結果 string(1) "5" filter_input()はHTTPヘッダにある5(int型)を参照した後に、内部で"5"(string型)に変換して返す。→結果 string(1) "5" int、string、array、未定義とすべて確認しましたが、結果は等価でした。 長くなってすみません(汗)。私が見当はずれな認識をしているかもしれません。認識が誤っていたら教えていただきたいです。
退会済みユーザー

退会済みユーザー

2018/09/19 23:55

name='hoge' を POST した時の以下のコードの挙動を追うと、違いがわかるかと。 $_POST['name'] = 'fuga'; if (!isset($_POST['name'])) { $name = null; } elseif (!is_string($_POST['name'])) { $name = false; } else { $name = $_POST['name']; } $name2 = filter_input(INPUT_POST, 'name'); $_POST が代入可能な変数であるため、同等にはならないです。 当然ですが、このコードでは $name に 'fuga' が入っています。 $name2 は 'hoge' です。 これが「値を拾ってくる元が違う」ということです。 **余談** $_POSTと$_GETは特に制限のある変数ではありません。 普通に new stdClass とか代入することも可能です。 また、回答に記述したように関数の挙動として、filter_input は NULL が与えられた場合、FILTER_DEFAULT では `` を返します。一般的に filter_input に NULL を与えることが無いので、実務上の差異は無いですが、この点でもやはり同等とは言えないです。
gsuisk

2018/09/20 12:56

ご説明ありがとうございます。 変更不可のHTTPヘッダを直接参照するfilter_inputとは挙動が異なってしまうということですね。 元の値としてNULLが投げられた時にfilter関数では '' (空文字)を返すが、質問文の式だとNULLを返す。という違いもあるのですね。 非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問