2014年11月2日日曜日

PHPデータ設計の基礎中の基礎「なし」の扱い方

PHPで空や偽など、データ無しの扱い方

PHPはWebアプリ用言語なので、フォームから値を受け取ったり、MySQLからデータを受け取ったりなどを前提とした言語となっています。
そこで、データが空だという事を簡単に判別するための関数が用意されています。

empty(); です。

これで入力データを判別できるようにデータ設計をするのが、拡張性が高くて不具合が発生しにくい設計になるでしょう。

"" (空文字列)
0 (整数 の 0)
0.0 (浮動小数点数の 0)
"0" (文字列 の 0)
NULL
FALSE
array() (空の配列)
$var; (変数が宣言されているが、値が設定されていない)

上記は全て『同じ』として扱います。

悪い設計例としては
1:なし
2:あり

正しい設計は
0:なし
1:あり

もし「なし」が無く全て有効な値だった場合は、1から開始してください。
0はデータ無しで統一すると、将来的に助かる場面がきっと出てきます。

プルダウンリストから選択する場合のインデックスは
0:不正 or 未選択
になります。
選択肢に0が無いのに0が来れば不正として処理。
選択肢に0があって0がくれば未選択となります。
有効なデータは必ず1番目以降を指定してください。


■未定義と空を区別したいケース

空の場合は空で上書きし、未定義の場合は変更無しというケースがあります。
その場合は、 isset(); を使ってください。
未定義とnullのみ同じとなります。

さらに未定義とnullを分けるような設計は複雑化しすぎなので、見直したほうが良いかもしれません。
is_null()を使うことで、nullかどうかの判別は可能です。

■MySQLの場合

nullは可能な限り使わないでください。 nullは特殊なオブジェクトなため、SQL文が面倒なことになります。
たとえば、 'foo' = null とは書けません。 'foo' IS NULL という特殊構文となってしまいます。
これは、nullを使うことで多くの制限が発生することを意味します。
デフォルト値はnullではなく0や空文字を使うようにしましょう。