PHPのプログラムを作っているとPOSTを使うことがたびたびあると思います。
そんなとき私がはまったのは、POSTされたデータが文字列になっていたこと!!
数字をPOSTして、その数字が0だったら、「0です」と表示するというプログラムがあったとします。
でも、0を入力しても何も表示されなかったんです…。
今回は、POSTされた値がどうなるのかを紹介します。
「var_dump」で型を確認しよう!
さすがに作成中のプログラムをそのままお見せするのは恥ずかしいのでサンプルプログラムがこのようにあったとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPEhtml> <html lang="ja"> <head> </head> <body> <form name="test_form" action="#" method="post"> <input type="number" name="test"> <input type="submit" name="submit" value="表示"> </form> <?php if( isset($_POST['test']) ){ $test = $_POST['test']; if($test === 0){ echo "0です"; } } ?> </body> </html> |
このプログラムで冒頭でお伝えしたことと同じように0と入力しても、何も表示されません。
プログラムは間違っていないはずなのに…。
うまく動かないときは、誰でもそう思いますよね。私も同じです。でも動かないのは事実なので原因を探してみましょう。
$_POST[‘number’]に0が入っている上で、「0です」と表示されないということは
- コードの13~15行目の条件に一致していない
の可能性があるはずです。なので、まずは$_POST[‘number’]にどんな値が入っているのかを確認してみましょう。
確認には
1 |
var_dump(); |
を使うといいですね。
確認したい変数は$_POST[‘test’]なので var_dump($_POST[‘test’]); と12行目の上に追加します。
結果は
ん?!なんでstring型??
「0です」と表示されなかった理由は?
文字列はstring型、数値はint型ですよね。
$testが0かどうかを確認する比較演算子は「===」を使っています。
例えば「$a === $b」のときは、
$a が $b に等しく、および同じ型である場合に TRUE になるんです。
test.phpでは、
- $test が string型
- 0 が int型
となり、型が違うため、比較結果がfalseになり、何も表示されないことがわかりました。($testは$_POST[‘test’]を入れているので、型も同じくstring型です)
対策は簡単で$testをint型に型変換して使えばいいんです。
そのため、思ったように表示されるプログラムは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPEhtml> <html lang="ja"> <head> </head> <body> <form name="test_form" action="#" method="post"> <input type="number" name="test"> <input type="submit" name="submit" value="表示"> </form> <?php if( isset($_POST['test']) ){ var_dump($_POST['test']); $test = $_POST['test']; if($test !== ""){ $test = intval($test); //$testをstring型からint型に変換 } var_dump($test); if($test === 0){ echo "0です"; } } ?> </body> </html> |
になります。
POSTされたデータは文字列になるのはなんで?
でもなんで$_POST[‘test’]はstring型だったのでしょうか?
$_POST は、「Content-Type に application/x-www-form-urlencoded あるいは multipart/form-data を用いた HTTP リクエストで、 HTTP POST メソッドから現在のスクリプトに渡された変数の連想配列」です。
何を言っているかわからないですよね(笑)
ようするに、$_POST は POST されたデータを、フォーマットに従って取り出した内容の格納先ということです。
この取り出しのとき $_POST に文字列(or 配列)として格納されるので、var_dumpした結果がstring型になっているということなんです!
まとめ
フォームでPOST されたデータは全て文字列になります。
これを頭に置いた上で、数値として扱うなら、型変換を行い使うことをおすすめします。