配列型の変数があり、そのままデータベース(mysql)に格納したいのですが、普段Javaで表示用に使っているtinyblobを適用すると、異常な出力が返ってきます。では、php の配列の正しいデータ型は何ですか。
$countryGoup=array("USA","FRANCE","GERMANY","BRITAIN");
あなたは出来る:
CREATE TABLE
ステートメントで列をSET('USA', 'France', 'Germany', ...) NOT NULL
(not null オプション) として定義し、次のようなクエリを使用します。
INSERT INTO myTable SET countries="USA,Germany";
したがって、countries
テーブルを定義します。
id_country|name
----------+-----------
1 |USA
2 |Germany
3 |France
メイン オブジェクト (例: 「ユーザー」) を国にリンクするピボット テーブルを定義して、多対多の関係を確立します。
たとえば、テーブルは次のようにテーブルをテーブルにusers_countries
リンクします。users
countries
id_user|id_country
------------------
1 |1
1 |2
2 |1
この例では、ユーザー 1 は ID 1 と 2 (米国とドイツ) を持つ国にリンクされ、ユーザー 2 は米国のみにリンクされます。
これには、サーバー側言語 (あなたの場合は PHP) を使用して値を区切り文字 (コンマ,
やパイプなど) で連結することが含まれます|
。
$countries = array("USA", "Russia", "Iran");
$countriesString = implode (",", $countries); // $countriesString = "Usa,Russia,Iran"
$query = "INSERT INTO mytable SET countries = '" . $countriesString . "'";
(注: 文字列値は例としてエスケープされていませんが、良い習慣ではありません)
データベースから値を取得するときは、入力した文字列を取得し$array = explode(",", $retrievedValueFromDb)
、同じ区切り文字を使用して配列を再度取得します。
アップデート:
find_in_set(needle, field)
文字列がコンマ区切り値フィールドに存在する場合、ゼロより大きい整数を返す関数にも依存できます。
したがって、アプローチ 1) を使用し、 のような文字列フィールドがある場合、次を使用して が存在する"USA,Germany"
列を取得できます。USA
SELECT * FROM myTable WHERE find_in_set('USA', countries) <> 0
アプローチ1)は、固定値がほとんどない場合に機能し、クエリでも非常に簡単です。欠点は、値が 64 個に制限されていること、値を固定する必要があること、およびセパレータとして使用されるコンマ (,) を含めることができないことです。
アプローチ 2)は最も標準化されており、正しく、正規化されており、クエリ効率も高い
アプローチ 3)は簡単ですが、追加の処理が必要であり、SQL ではそれほど簡単ではありません
他の場所で述べたように、dbms には「配列」データ型はありません。回避策を使用する必要があります。