2011年10月17日月曜日

PHPで0から始まる数値を扱う時の失敗

データベース上でZEROFILLしてあるカラムとか、sprintf('%02d', $number)とかでゼロ埋めしたような数値を扱うことがありました。
この時に0で始まる数値のことを考えずにコードを書くと不具合がでてしまうことがあります。

例えば以下のようなコード

$errors = array (01, 02, 08, 09);
foreach ($errors as $error_code) {
    switch ($error_code) {
        case 01:
            echo 1;
            break;
        case 02:
            echo 2;
            break;
        case 08:
            echo 8;
            break;
        case 09:
            echo 9;
            break;
      }
}

こんなコードを書くと、08の時にcase 08とcase 09を実行し、09の時も同じようにcase 08と09を実行します。

PHPだけじゃなくて他の言語でもそうだと思うけど、0から始まる数値は8進数として扱われます。
上記のコードの場合、0〜7までは動作するけど、8進数では8になると桁が繰り上がるので8以上の値は存在しません。
この時、08の時も09の時も0として扱われているので、 case 08 = case 09 = case 0ということになります。

なので、もし、$errorsの配列に'00'という値があれば、00が回って来た時にもcase 08と case 09を実行していることになります。

ゼロ埋めした数値は時々使うことがあるので、気を付けないといけませんなぁ。

0 件のコメント:

コメントを投稿