2011-07-22 9 views
2

まず、一例として、このページを見てみましょう:あなたは「設備」セクションを閲覧した場合Click hereMySQLデータベースにチェックボックスの値を保存する最も良い方法は何ですか?

、チェックボックスの3セット(ユニットの特長、家賃に含まれるコミュニティ機能とユーティリティ)があります。

、私の質問は:はどのように私は3配列変数にするためにPHPを使用します(例えば$ unit_features、$ community_featuresをし、$ utilities_included)/テーブル内の3つのそれぞれのフィールドにチェックインされていないされているボックス保存することができますか?

さらに重要:特定のデータを表示/編集/削除できるように、同じアレイ形式でテーブルからデータを取り出すにはどうすればよいですか?

  • 注、私は(tinyintsとして)テーブル内の別のフィールドを持っていることによって、これを行うために数え切れないほどの時間を試してみた - しかし、それはかさばる取得し、全く...私も作る考えエレガントではありませんオブジェクトクラスですが、もう一度失敗しました。
+0

JSONをDBに保存していますが、これはPHP標準ではありません。p – genesis

+4

そのコメントは無視してください。それは非常に貧しいアドバイスです。 –

答えて

6

プロパティとアメニティの間には多対多の関係があります。これをモデル化するには、可変数の列ではなく、別の表が必要です。

プロパティを格納するテーブルが1つあります。

INSERT INTO property (id, address, square_footage...) VALUES (111, '123 Main St', 1234...) 

すべての可能なアメニティを格納するテーブルが1つあります。プロパティがあり、各アメニティに関して

INSERT INTO amenities (id, type, description) VALUES (222, 'Unit Features', 'Air Conditioning'); 

、これら二つの関連テーブルに1行を挿入:

INSERT INTO property_amenitities (property_id, amenity_id) VALUES (111, 222); 

あなたが持っている特定のプロパティを設備かを知りたい場合は、単にSELECTすべての行をこの表からそのプロパティのキーのために。すべてのアメニティのチェックボックスを印刷する場合は、amenitiesテーブルからSELECTテーブルを選択し、LEFT OUTER JOINからproperty_amenitiesテーブルにチェックボックスを印刷します。 property_amenitiesテーブルからのヌル値を持つ行は、チェックされていないボックスです。

Related reading。彼らはビジネスの外に出る前に地元のBORDERSからリレーショナルデータベースの本を手に入れなければなりません:)

+0

ダン、ありがとうダン、私は間違いなくデータ構造と正常化dbsの私の理解を向上させる必要があります - 私は省略形の修正を探していますが、実際の問題(私はデータ構造についてはあまり知らない)を避けるだけだと思います –

+0

ダン - JOINステートメントについて混乱しています。私はJOIN&OUTER JOINステートメントに関するいくつかの読書をしてきましたが、ここでそれらを適用する方法を理解していません。プロパティのチェック/チェックされていないアメニティを印刷するためのサンプルSQL文を提供できますか? –

+1

'SELECT amenities。*、property_amenities.property_id施設からLEFT OUTER JOIN property_amenities ON amenities.id = property_amenities.amenity_id WHERE property_amenities.property_id = 7'。 'property_id'の値を持つ行はチェックボックスになり、' property_id'のためのNULLを持つ行はチェックされていないボックスになります。 –

1

これらは互いに排他的ではない場合、ビット単位の演算子を使用してそれらを格納できます。

field = 0; 
if($unity_features_selected == true) { 
    field |= (1<<0); 
} 
if($community_features_selected == true) { 
    field |= (1<<1); 
} 
if($utilties_included_selected == true) { 
    field |= (1<<2); 
} 

フィールドを符号なし整数として格納します。 (例unity_features):

select * from <table> where field&(1<<1); 
+0

誰が私の名前をつけたのですか? – Suroot

+0

おそらく関係や「複数の列を使用しているだけ」は言及していません;-)私はバランスを取るために+1を持っていますが、より丸められた答えになる可能性があります。このようにしばしば時間がかかるのは、 "早期の最適化"として行われ、慎重な決定ではありません。 (私はこのアプローチが良くないと言っているわけではなく、実際には、データのエンコーディングなど、いくつかの非常に特殊なケースで使用しています。 )いずれにしても、これは実際には "それがどれくらい簡単か"ということにはまだ言及していません。 –

+0

彼のウェブページを見ましたか? 3つのチェックボックスはありませんが、31のチェックボックスがあり、アプリケーションがあればそれは変わる可能性があります。彼はまた、人々がプロパティを検索するときに、これらの個々のチェックボックスに対して通常のクエリを実行したいと考えています。このような整数フィールドに通常の関係をパックしようとする理由はありません。あなたは貧しいアドバイスをしてダウンフォワードされました。 –

-3

1)PHPのシリアル化とアンシリアライズ(http://php.net/manual/en/function.serialize.php )あなたが配列またはオブジェクトまたはその他を保つのを助けるこれは、このような

select * from <table> where field&(1<<0); 

やコミュニティ機能としては、のために照会することができますdb内の構造データ。

2)ここで説明するように、入力者の名前の配列形式を使用します。Submitting a multidimensional array via POST with php

3)が未チェックのチェックボックスは、すべてのチェックボックスフィールドのための1つの隠れ入力フィールドを作るので、常に、全く送信されないことを覚えておいてください。それは、チェックされていないchecboxがfalseとして送信されることを保証します。 Post the checkboxes that are unchecked

このように、すべてのチェックボックス(1または0)に対して虚偽の配列を送信し、3つのフィールドにシリアル化されたオブジェクトとして格納することができます。

+0

基本的な関係をシリアライズされたPHP配列として単一の列に格納し、個々のリレーションシップを問合せ不可能、更新不可能、削除不可能にすることをお勧めします。データベースの正規化101は、フィールドを単一値にする必要があるということです。このデータベースは、これらの規範を無視する理由を提示する特殊なケースではありません。 –

+0

あなたが正しいです、あなたが投稿したのと同じように、新しいテーブルを作成する必要があります。私の提案は良いでしょうが、これらのchecboxがSQLクエリーに使用されず、それ以外のフィールド全体がPHPになってしまった場合のみです。 – Luigi

+0

シリアライズされたデータは間違いなく避けなければなりません...実際にデータを扱うときは本当に悪夢です。 –

関連する問題