水曜以外もどうでしょう

北海道発。食べ歩きの記録グルメ情報や北海道の見どころなどをメモ替わりに書いています。

PREV | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| スポンサー広告 | --:-- | comments(-)| trackbacks(-)| TOP↑

≫ EDIT

phpでの文字列比較の落とし穴が・・form受け渡しでのトラブルも

いろんなところで論じられている、文字列比較での落とし穴。

復習を兼ねて(いや、実際にやってみて改めて理解した)、練習問題を。

以下、どんな結果が得られるか予想をしてみましょう。

  // (1)
$a = "abc";
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (2)
$a = "10";
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (3)
$a = "0";
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (4)
$a = "0";
if( $a === 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (5)
$a = 0;
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (6)
$a = 0;
if( $a === 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (7)
$a = 0;
if( $a == "0" ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (8)
$a = 0;
if( $a === "0" ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }









実行結果は以下です。

true
false
true
false
true
true
true
false




基本ルールとして、
== での比較は、型比較を行わない
=== での比較は、型比較を行なう

ということを理解していても、php君がどう解釈するのかはやってみると一目瞭然。

私も。勘違いをしていました。

(1)
文字列"abc"と、数値0の変則比較。
「文字列の最初の部分が、有効な数値データで始まるもの以外は0となる」らしく、
true。

(2)
変則比較ながら、文字列"10"を数値の10に変換して比較するようだ。
よってfalse

(3)
(2)と同じ理由でtrue

(4)
そもそも型がちがうので、false

(5)~(8)は確認用の基本的なやつですね。



今回、この事案との組み合わせではまってしまったのは、formからのpostデータ。

以下のような選択肢で、未選択の場合のエラーチェックをしたとき。

<select name="fruit">
<option value="0">選択してください</option>
<option value="1">りんご</option>
<option value="2">みかん</option>
</select>




if( $_POST['fruit'] === 0 ) {
    echo '未選択です';
}




の様なエラーチェックにヒットしない。

つまり、select~optionのvalue値は、phpでは文字列として受け取ることがわかった。



やっぱり奥が深い。



スポンサーサイト
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 17:09 | comments:0| trackbacks:0| TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://vmemo.blog36.fc2.com/tb.php/328-03c05472

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。