PR

入力チェックをする際や関数の引数を比較する際、値の中身だけでなく値の型も 比較しないと誤作動を起こしてしまう可能性があります。

空文字や0、nullやFALSEの違いを把握し、適切な式で値判定をしていますか?

入力フォームで、金額を入力する部分を作ったとします。 必須項目ではないので、何かしらの数字が入力されていたらDBに登録する処理を 作ったとします。

//記入があったら
if (!$_POST["price"]) {
  //以下登録処理

}

以上のように、$_POST["price"]に対して!を用いてTRUEかFALSEの判定をしてい ます。 この例ですと、"0"を入力された場合にもFALSEの判定がされ、登録処理が行われ ない事になってしまいます。 実際のところ「数字が記入されていたら」という判定をするのが一番なのです が、簡単に済まそうと!を不用意に用いると思わぬ穴を作る場合があります。

次の例ではどうでしょうか。

配列$data_listの値の中に、指定された$find_dataがあるかどうか探し、もし あったらそのキーを表示するというスクリプトを作ります。 array_search関数を使い、見つからなかったらFALSEを返すのですから、以下の ように書きました。

$array = array(0 => 'data1', 1 => 'data2', 2 => 'data3', 3 => 'data4');

$key = array_search($find_data, $array);
if ($key != FALSE) {
  //発見
  print $key;
} else {
  //発見できず
  print "見つかりませんでした";
}

この例ですと、$find_dataで探そうとしていた値が$arrayの[0]に入っていた場 合、$keyには0が入ります。 ですが$keyの値「0」はFALSEと評価されてしまうので、「見つかりませんでし た」と表示されてしまい、見つかった処理にはいけません。

このようなFALSEと評価される答えを返す場合がある時は特にですが、値の型も 考慮して比較しましょう。

if ($key !== FALSE) {
  //発見
  print $key;
} else {
  //発見できず
  print "見つかりませんでした";
}

型まで比較しようと思うならば、$a === $b($a !== $b)などのように=を3つ 使った比較演算子を使います。

参考:http://jp.php.net/manual/ja/language.operators.comparison.php

PHPのマニュアルには、空文字やNULL、FALSEや0などの型において、それぞれの TRUEやFALSEを記した型の比較表という付録がついています。 全てを厳密に覚えている人は少ないかも知れませんが、より正確なスクリプトを 組む際はある程度の知識は必須になるでしょう。

これくらい自信があるよ、という人はPHP Syntax Examというサイトがあります ので、こちらで腕試しをしてみるのも面白いでしょう。 上記の型比較の他にも、色々な形式でTRUEかFALSEかを問われます。 あなたは何点取れるでしょうか?

BlueShoes: PHP Syntax Exam:http://www.blueshoes.org/en/developer/syntax_exam/


(アシアル 古見澤宏)

この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。