たとえば画面上に2択のラジオボタンがあり、submit後にそのvalue値を判定したり、
Postgresqlから取得したBoolフィールドの値を判定したり、
DBに更新するときには't'とか'f'という値を代入したりしているのですが、
その代入した変数を判定したりするときなど、
判定方法がパっと浮かばないで、いつもトライ&エラーの状態になって時間を取ってしまいます。
なにか良い覚え方や、bool値を扱う上での要所などあるでしょうか
答えになっているかどうかわかりませんが、
私の場合はデータベースの型をBoolean型ではなく
INTEGER型で0または1を格納する方法でやってます。
こうしておけば、フォームからの送信内容の判定も、
通常のIF文で判定ができ、
データの更新時などは
更新前に該当項目を三項演算子で
$bool = $bool ? 1 : 0
のような感じで値をしなおせばいいだけなので、
INTEGER型で定義するようにしておけばいいのではないでしょうか?
覚えるものではなく設計書という形で残しておくべきことだと思いますが、それはさておき
カラムにコメントつけておくという手があります。使っている例をあまり知りませんけどね。
http://www.postgresql.jp/document/8.4/html/sql-comment.html
COMMENT ON COLUMN my_table.my_column IS 'Employee ID number';
使わない理由
現在、コメントにはセキュリティ機構は存在しません。データベースに接続したユーザは誰でも、そのデータベース内のオブジェクトのコメントを参照することができます(ただし、所有していないオブジェクトに関するコメントを変更できるのはスーパーユーザのみです)。データベース、ロール、テーブル空間などの共有オブジェクトに対するコメントは大域的に格納され、任意のデータベースに接続した任意のユーザが共有オブジェクトに対するコメントをすべて見ることができます。そのため、コメントにはセキュリティ的に重大な情報を記載してはいけません。
例
※コメントはCREATE TABLE時でも書けます。
データの内容によってデータ型を合わせるという手もあります。
真偽の状態をあらわすもの | ブール値 |
特定の状態をあらわすもの | 数値 |
データ容量的にはブール値は1バイト、数値はsmallでも2バイトですから賢い選択とは言えませんが、
容易に扱えないのでは何をしていることやら判りませんので、私はこちらを推奨します。
http://www.postgresql.jp/document/8.4/html/datatype-boolean.html
booleanは格納に1バイト使用します。
http://www.postgresql.jp/document/8.4/html/datatype-numeric.html
smallint 2バイト 狭範囲の整数 -32768から+32767
「データ容量が・・・」ということであれば、くどくなりますが設計書を用意しましょう。
まずはテーブル毎に簡単な表(かなり省略形。必要なものは適宜追加してください。)を作っておけば十分でしょう。
カラム名 | 型 | 値の範囲 | デフォルト | Not Null | ユニーク | インデックス | コメント |
---|---|---|---|---|---|---|---|
s | smallint | 1:男, 2:女, 3:おかま, 0:未登録 | 0 | レ | - | - | |
n | text | 氏名 | - | レ | - | レ | 氏と名の間に半角でも全角でも良いから空白を1つ以上あける |
もっと手抜きしたいならばCREATE TABLEの構文を整形してコメント追加したものでも良いです。
回答ありがとうございます。
勉強になりましたが、質問の説明が足りなかった気がしてきました。
bool値を判定するときたとえば't'or'f'だったり"0"or"1"だったり0or1だったりいろいろあると思うんですけど
どんなデータ型で来てもそれを意識することなく使えるような汎用的な(便利な)真偽判定用の条件式はないだろうか、
というのが具体的な質問に至った動機です。
答えになっているかどうかわかりませんが、
私の場合はデータベースの型をBoolean型ではなく
INTEGER型で0または1を格納する方法でやってます。
こうしておけば、フォームからの送信内容の判定も、
通常のIF文で判定ができ、
データの更新時などは
更新前に該当項目を三項演算子で
$bool = $bool ? 1 : 0
のような感じで値をしなおせばいいだけなので、
INTEGER型で定義するようにしておけばいいのではないでしょうか?
型をINTEGERで定義しておいて$bool = $bool ? 1 : 0で更新するというのは使えそうな気がしますし、考え方としてわかりやすいです。
PosgreのBOOL型のデータ型の扱いを考えなくて済みますね
まあ今からINTEGER型に変更すると大変そうなので、次から考えてみたいと思います。
「フォームからの送信内容の判定も、通常のIF文で判定ができ」
というのは具体的にはどのようなことでしょうか
それからちなみにデータベースのInteger型のフィールドから取得した値はどのような判定をしていますか
ふつうに if($flag==1){}else{} でしょうか。
参考まで、お願いします。
話をブール値だけに絞ります。
bool値を判定するときたとえば't'or'f'だったり"0"or"1"だったり0or1だったりいろいろある
そのとおりですね。処理系によって値はいろいろあります。
だからこそ答えは単純です。定数(TRUE/FALSE)を使い内部の値は使わないように統一します。
定数を使えば処理系の違いも超えられますし、視覚的にも判り易いコーディングになります。
型をINTEGERで定義しておいて$bool = $bool ? 1 : 0で更新するというのは使えそうな気がしますし、考え方としてわかりやすいです。
PosgreのBOOL型のデータ型の扱いを考えなくて済みますね
まあ今からINTEGER型に変更すると大変そうなので、次から考えてみたいと思います。
「フォームからの送信内容の判定も、通常のIF文で判定ができ」
というのは具体的にはどのようなことでしょうか
それからちなみにデータベースのInteger型のフィールドから取得した値はどのような判定をしていますか
ふつうに if($flag==1){}else{} でしょうか。
参考まで、お願いします。