PHP + Postgresql でBoolean値の判定について。

たとえば画面上に2択のラジオボタンがあり、submit後にそのvalue値を判定したり、
Postgresqlから取得したBoolフィールドの値を判定したり、
DBに更新するときには't'とか'f'という値を代入したりしているのですが、
その代入した変数を判定したりするときなど、
判定方法がパっと浮かばないで、いつもトライ&エラーの状態になって時間を取ってしまいます。

なにか良い覚え方や、bool値を扱う上での要所などあるでしょうか

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/04/14 23:10:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:wate_wate No.2

回答回数45ベストアンサー獲得回数3

ポイント100pt

答えになっているかどうかわかりませんが、

私の場合はデータベースの型をBoolean型ではなく

INTEGER型で0または1を格納する方法でやってます。

こうしておけば、フォームからの送信内容の判定も、

通常のIF文で判定ができ、

データの更新時などは

更新前に該当項目を三項演算子で

$bool = $bool ? 1 : 0

のような感じで値をしなおせばいいだけなので、

INTEGER型で定義するようにしておけばいいのではないでしょうか?

id:dedara

型をINTEGERで定義しておいて$bool = $bool ? 1 : 0で更新するというのは使えそうな気がしますし、考え方としてわかりやすいです。

PosgreのBOOL型のデータ型の扱いを考えなくて済みますね

まあ今からINTEGER型に変更すると大変そうなので、次から考えてみたいと思います。


「フォームからの送信内容の判定も、通常のIF文で判定ができ」

というのは具体的にはどのようなことでしょうか


それからちなみにデータベースのInteger型のフィールドから取得した値はどのような判定をしていますか

ふつうに if($flag==1){}else{} でしょうか。

参考まで、お願いします。

2010/04/14 04:00:19

その他の回答2件)

id:GreenStar No.1

回答回数192ベストアンサー獲得回数46

ポイント20pt

覚えるものではなく設計書という形で残しておくべきことだと思いますが、それはさておき

カラムにコメントつけておくという手があります。使っている例をあまり知りませんけどね。

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の構文を整形してコメント追加したものでも良いです。

id:dedara

回答ありがとうございます。

勉強になりましたが、質問の説明が足りなかった気がしてきました。

bool値を判定するときたとえば't'or'f'だったり"0"or"1"だったり0or1だったりいろいろあると思うんですけど

どんなデータ型で来てもそれを意識することなく使えるような汎用的な(便利な)真偽判定用の条件式はないだろうか、

というのが具体的な質問に至った動機です。

2010/04/14 03:39:16
id:wate_wate No.2

回答回数45ベストアンサー獲得回数3ここでベストアンサー

ポイント100pt

答えになっているかどうかわかりませんが、

私の場合はデータベースの型をBoolean型ではなく

INTEGER型で0または1を格納する方法でやってます。

こうしておけば、フォームからの送信内容の判定も、

通常のIF文で判定ができ、

データの更新時などは

更新前に該当項目を三項演算子で

$bool = $bool ? 1 : 0

のような感じで値をしなおせばいいだけなので、

INTEGER型で定義するようにしておけばいいのではないでしょうか?

id:dedara

型をINTEGERで定義しておいて$bool = $bool ? 1 : 0で更新するというのは使えそうな気がしますし、考え方としてわかりやすいです。

PosgreのBOOL型のデータ型の扱いを考えなくて済みますね

まあ今からINTEGER型に変更すると大変そうなので、次から考えてみたいと思います。


「フォームからの送信内容の判定も、通常のIF文で判定ができ」

というのは具体的にはどのようなことでしょうか


それからちなみにデータベースのInteger型のフィールドから取得した値はどのような判定をしていますか

ふつうに if($flag==1){}else{} でしょうか。

参考まで、お願いします。

2010/04/14 04:00:19
id:GreenStar No.3

回答回数192ベストアンサー獲得回数46

ポイント20pt

話をブール値だけに絞ります。

bool値を判定するときたとえば't'or'f'だったり"0"or"1"だったり0or1だったりいろいろある

そのとおりですね。処理系によって値はいろいろあります。


だからこそ答えは単純です。定数(TRUE/FALSE)を使い内部の値は使わないように統一します。

定数を使えば処理系の違いも超えられますし、視覚的にも判り易いコーディングになります。

  • id:wate_wate
    if($flag==1){}else{}
    フォームからの送信内容に関しては、
    サニタイズがされているのを前提として話をすれば、
    わざわざ値を指定せずとも
    -----------
    if($flag){
    echo "はい";
    }else{
    echo "いいえ";
    }
    -----------
    という感じです。

    データベースから取得した内容も、
    これと同様に判定しています。

    場合によっては
    --------------
    <?= $flag ? "はい" : "いいえ" ?>
    --------------
    というような書き方でもいいと思います。
  • id:taknt
    いったん その値を 表示させるようにして それから 修正したらいいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません