ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

filter_inputで取得した数値が、if文で正常に比較できない?

PHPでフォームから送信されてきた値を取得には、filter_inputという関数を用いることになります。

その値をif文で比較したかったのですが、数値だったときになぜか思い通りに比較ができないことがありました。

広告

送信フォーム

<form method="get">
	<input type="text" name="test" />
	<button type="submit">
		送信
	</button>
</form>

<?php var_dump(filter_input(INPUT_GET, "test")); ?>

今回は、ただ単純に入力ボックスが一つだけのフォームを作ってみます。

また、送信すると同じページに戻ってきますが、フォームのすぐ下に入力値が表示されるようにしています。

echoではなくvar_dumpで、取得した値を表示することで、表示を行った行番号と型も表示されるので、デバッグに最適です。

そして次に、フォームの値をif文にかけてみます。

<?php
	if(filter_input(INPUT_GET, "test") === 123456) {
		echo "OK";
	} else {
		echo "NG";
	}
?>

フォームから送信された値が123456であるかどうかの比較ですが、写真のとおり123456と入力しているので、これならばOKになるはず。

しかし、実際にやってみた結果、結果はNGでした。

同じ値のはずなのに、どうしてでしょうか?

原因

先程のvar_dumpの出力結果を見てみると、フォームの値の型は「string」、つまり文字列型となっています。

123456という、数字を入力しているのですが、methodがgetであろうとpostであろうと、必ず文字列型になってしまいます。

そしてif文で比較に使っている記号は3つのイコール。

3つのイコールは、入力値だけでなく型まで完全に一致しているかどうかの比較になります。

比較対象である123456は数値型であるものの、フォームから送信された”123456″は文字列型であるため、一致しなかったということになります。

対処法。

<?php
	if(filter_input(INPUT_GET, "test") == 123456) {
		echo "OK";
	} else {
		echo "NG";
	}
?>

まずは、3つイコールではなく2つイコールによる比較に変えること。

2つイコールによる比較では、値が同一かどうかだけの比較になり、型までは比較しなくなります。

よって、数値型の123456と文字列型の”123456″は一致するということになります。

しかし、数値として想定していた入力値を、のちのち増減させたりすることもあるでしょう。

そうなると、文字列型のままではエラーになってしまいます。

よってその場合は、入力値をintvalで数値型に変換するのがいいでしょう。

<?php
	$val = intval(filter_input(INPUT_GET, "test"));
	if($val === 123456) {
		echo "OK";
	} else {
		echo "NG";
	}
?>

ただ、フォームにもし数字以外を入力されてしまったら、それではintvalが使えません。

そういうときは、フォームのtypeを変更して、数字以外は入力できないようにしましょう。

<form method="get">
	<input type="number" name="test" />
	<button type="submit">
		送信
	</button>
</form>