POSTで受け取ったデータは文字列型になる

基本的なことですが、少しはまったのでメモしておきます。

$_POSTで受け取ったデータも自動で型変換される

たとえば次のようなごく簡単なフォームがあって、value内の数値によって処理を変えたいとします。
※そもそもvalueに数値を使わずに文字列を使う方がシンプルではありますが。今回はそれは使わないということで。

<form>
<select name="fruits" size="1">
	<option value="0">りんご</option>
	<option value="1">オレンジ</option>
	<option value="2">すいか</option>
</select>
</form>

これを$_POSTで受け取り、データを表示する場合、正しくは下記のようになります。

<?php
$favorite = $_POST['fruits'];

if ($favorite == "0") {
	echo "りんご";
} elseif ($favorite == "1" ){
	echo "オレンジ";
} elseif ($favorite == "2") {
	echo "すいか";
}
?>

しかし、じつはPHPは型付けの緩い言語なので、次のようにダブルクォーテーションなしでIFの判定を書いても、暗黙的に型変換をして判別してくれます。

<?php
$favorite = $_POST['fruits'];

//数値を""で囲っていない(文字列型として扱っていない)
if ($favorite == 0) {
	echo "りんご";
} elseif ($favorite == 1 ){
	echo "オレンジ";
} elseif ($favorite == 2) {
	echo "すいか";
}
?>

型変換されてしまうことによる誤判定

ですが、上記のような曖昧な使い方をしていると次のようにvalueに数値と文字列が混在している場合に意図しない挙動になる恐れがあります。

まずフォームから。

<form>
<select name="fruits" size="1">
	<option value="0">果物は嫌い</option>
	<option value="apple">りんご</option>
	<option value="orange">オレンジ</option>
	<option value="watermelon">すいか</option>
</select>
</form>

次にPHPです。

<?php
$favorite = $_POST['fruits'];

if ($favorite == 0) {
	echo "果物は嫌い"
} elseif ($favorite == "apple") {
	echo "りんご";
} elseif ($favorite == "orange" ){
	echo "オレンジ";
} elseif ($favorite == "watermelon") {
	echo "すいか";
}
?>

このようなPHPを書いてしまった場合、たとえばフォームで「apple」が選択されていた場合でも、IF文の条件判定はすべて($favorite = = 0)をTRUEとしてしまいます。
これは、「0」を本来受け渡されている文字列型として使っていないためです。

誤判定を避けるための対策

そのため、$_POSTでデータを受け取って使う場合には必ず($favorite == “0”)のように文字列として取得する必要があります。
なお、さらに安全に扱うためには、データ型の一致まで確認する「= = =」を使い、以下のようにすることをおすすめします。

if ($favorite === "0") {