プロが教えるわが家の防犯対策術!

特にPHPに限った質問というわけではないのですが、複数のチェックボックスからのデータをmySQLにためて、ユーザーが検索できるプログラムを作っています。
チェックボックスの数があまり多くないので、項目ごとにフィールドを追加してやってもいいのですが、あまりスマートではないし、後で項目の追加があった場合に対応できないので、一つのフィールドにすべてのチェックボックスのデータを納めたいと思っています。
一般的にこのような場合、どのように処理するのでしょうか?
方法を考えたのですが、チェックボックスのvalueに
value=1 value=2 value=4 value=8・・・として、チェックがある項目は全部足して2進数に変換してDBに登録し、(例えば、value=1とValue=8にチェックがあったら9となり、2進数では1001でonが判別できます)ユーザーが検索するときには同じく検索条件を2進数に変換して論理積で1以上のものを抜き出せば自分の想像通りの動きはしそうです。
ただ、DBから抜き出すときにいちいち論理積でパターンマッチしたものを抜き出す必要があるので、あまり高速ではない(?)&SQL文一発で書けないのでちょっと処理が面倒かなと思っています。
ちょっと説明がうまくできなくてわかりづらいとは思いますが、何かいい方法はないでしょうか?

A 回答 (3件)

#3です。

すみません「OR field = 9」が抜けてました。

最後の部分に、

if ($flg) {
$sql .= "OR field = $value";
} else {
$sql .= "field = $value";
}

が必要でした。それと
検索値がビット績の結果のいずれかと同じ値だった場合の処理も必要ですね、、、
もう一つフラグを用意して立っていた場合に、追加するのを止めればいいのかな?
ご自身で考えてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほど、参考になりました。
早速試してみます。

お礼日時:2003/09/17 13:52

検索する値と2のN乗とのビット積が0でない場合に 'OR' で


つなげてやればどうでしょう?

質問の例だと、
検索する値:9
2の0乗とのビット績:1
2の1乗とのビット績:0
2の2乗とのビット績:0
2の3乗とのビット績:8
なので
SELECT * FROM table WHERE field=1 OR field=8

あまりスマートじゃないけどスクリプトの例です。
($valueは検索値)

$n = 4;
$flg = 0;
$sql = "SELECT * FROM table WHERE ";

for ($i = 0; $i < $n; $i++) {
$k = pow(2, $i);
$q = ($value & $k);
if ($q > 0) {;
if ($flg) {
$sql .= "OR ";
}
$sql .= "field = $q ";
$flg = 1;
}
}
    • good
    • 0

私だったら、チェックボックスごとに


フィールド設定します。
わかりやすいから。

> 例えば、value=1とValue=8にチェックがあったら9となり
このやり方でやるのならば、DBに格納するのは10進数にします。
この例なら9。
SQLで引っ張るときは、おっしゃるとおり論理積で
select * from テーブル名 where 9 & フィールド名 = 9;
とかやれば、出てくるかと。
    • good
    • 0
この回答へのお礼

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

説明が足りずに申し訳ありません。
>select * from テーブル名 where 9 & フィールド名 = 9;
そうすると、value=1とValue=8にチェックがあるときの完全一致の場合のみ検索結果がヒットすることになりますよね。
value=1のときだけチェックが入っている場合もヒットさせたいし、8にチェックがあるときだけでもヒットさせたいのです。(この辺を略して「論理積で1以上」と書いたのです。わかりにくくてすいません)
何かいい方法はないでしょうか?

お礼日時:2003/09/16 21:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!