データの配列を単一のmysqlフィールドに保存する良い方法は何ですか?
また、mysqlテーブルでその配列をクエリしたら、それを配列形式に戻す良い方法は何ですか?
答えをシリアライズおよびシリアライズ解除しますか?
回答:
配列を単一のフィールドに格納する良い方法はありません。
リレーショナルデータを調べて、スキーマに適切な変更を加える必要があります。このアプローチのリファレンスについては、以下の例を参照してください。
配列を単一のフィールドに保存する必要がある場合はserialize()
、unserialize()
関数でうまくいきます。ただし、実際のコンテンツに対してクエリを実行することはできません。
シリアル化関数の代替として、json_encode()
およびも ありjson_decode()
ます。
次の配列を考えます
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
データベースに保存するには、次のようなテーブルを作成する必要があります
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
'DROP TABLE IF EXISTS test');
$r = mysql_query(
'CREATE TABLE test (
id INTEGER UNSIGNED NOT NULL,
a INTEGER UNSIGNED NOT NULL,
b INTEGER UNSIGNED NOT NULL,
c INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
)');
レコードを操作するには、次のようなクエリを実行できます(これは一例です。注意してください)。
function getTest() {
$ret = array();
$c = connect();
$query = 'SELECT * FROM test';
$r = mysql_query($query,$c);
while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
$ret[array_shift($o)] = $o;
}
mysql_close($c);
return $ret;
}
function putTest($t) {
$c = connect();
foreach ($t as $k => $v) {
$query = "INSERT INTO test (id,".
implode(',',array_keys($v)).
") VALUES ($k,".
implode(',',$v).
")";
$r = mysql_query($query,$c);
}
mysql_close($c);
}
putTest($a);
$b = getTest();
connect()
関数は、MySQLの接続リソースを返します。
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
一般的には、はい、シリアライズとアンシリアライズする方法です。
ただし、データが単純なものである場合は、コンマ区切りの文字列として保存することをお勧めします。たとえば、配列が数値のリストになることがわかっている場合は、implode / explodeを使用する必要があります。それは違います1,2,3
とa:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
。
そうでない場合は、すべてのケースで作業をシリアライズおよびシリアライズ解除します。
DBに格納するための配列のシリアル化/シリアル化解除
http://php.net/manual/en/function.serialize.phpにアクセスします
PHPマニュアルから:
ページの「返品」をご覧ください
どこにでも格納できる値のバイトストリーム表現を含む文字列を返します。
これはnullバイトを含む可能性があるバイナリ文字列であり、そのように格納および処理する必要があることに注意してください。たとえば、serialize()出力は、通常、CHARまたはTEXTフィールドではなく、データベースのBLOBフィールドに格納する必要があります。
注:HTMLをBLOBに保存する場合は、Base64でエンコードしてください。そうしないと、シリアライズ機能が動作しなくなる可能性があります。
エンコーディングの例:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
これでblobに保存する準備ができました。
blobからデータを取得したら、base64_decodeを実行してから、サンプルのデコードをシリアル化解除する必要があります。
$theHTML = unserialize(base64_decode($YourSerializedData));
私が自分で見つけた最良の方法は、区切り文字を含むデータ文字列として配列を保存することです
$array = array("value1", "value2", "value3", "...", "valuen");
$array_data = implode("array_separator", $array);
$query = "INSERT INTO my_tbl_name (id, array_data) VALUES(NULL,'" . $array_data . "');";
その後、単純なクエリで配列に格納されたデータを検索できます
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
explode()関数を使用して、「array_data」文字列を配列に変換します
$array = explode("array_separator", $array_data);
これは多次元配列では機能しないことに注意してください。「array_separator」が一意であり、配列値に存在していないことを確認してください。
注意してください !!!フォームデータを取得してデータベースに入れるだけでは、フォームデータはSQLセーフではないため、罠にかかってしまいます。フォームの値はmysql_real_escape_stringで処理する必要があります。MySQLimysqli :: real_escape_stringを使用する場合、 または値が整数またはブールキャスト(int)(boolean)の場合
$number = (int)$_POST['number'];
$checked = (boolean) $_POST['checked'];
$name = mysql_real_escape_string($db_pt, $_POST['name']);
$email = mysqli_obj->real_escape_string($_POST['email']);
前述のように、配列内のデータを検索する必要がない場合は、serializeを使用できますが、これは「phpのみ」です。だから私はjson_decode / json_encodeを使用することをお勧めします-パフォーマンスだけでなく可読性と移植性のためにも(javascriptなどの他の言語はjson_encodedデータを処理できます)。
ええと、なぜ誰もがアレイのシリアル化を提案する理由がわかりません。
私が言うには、最良の方法は実際にデータベーススキーマに適合させることです。私はあなたの配列のデータの実際の意味の意味についてはわかりません(そしてあなたは手がかりを与えませんでした)が、一般的にそのようなシーケンスを格納する2つの方法があります
create table mydata (
id int not null auto_increment primary key,
field1 int not null,
field2 int not null,
...
fieldN int not null
)
このようにして、配列を単一の行に格納します。
create table mydata (
id int not null auto_increment primary key,
...
)
create table myotherdata (
id int not null auto_increment primary key,
mydata_id int not null,
sequence int not null,
data int not null
)
最初の方法の欠点は、配列に多くのアイテムがある場合、そのテーブルでの作業が最も洗練されたものにならないことです。可変長のシーケンスを処理することも非現実的です(可能ですが、非常に洗練されていません。列をnullにするだけです)。
2番目の方法では、任意の長さのシーケンスを持つことができますが、タイプは1つだけです。もちろん、1つのタイプのvarcharなどを作成して、配列の項目をシリアル化できます。最善の方法ではありませんが、アレイ全体をシリアル化するよりも確かに優れていますよね?
どちらの方法でも、このメソッドにはシーケンスの任意の要素にアクセスできるという明確な利点があり、配列のシリアル化やそのような醜いことを心配する必要はありません。
それを取り戻すことに関しては。さて、クエリを使用して適切な行/行のシーケンスを取得し、ループを使用してください。
個々の配列項目のいずれにも含まれないことがわかっている文字で、分解/分解を使用することをお勧めします。次に、それを文字列としてSQLに保存します。
値が配列に含まれているため、関数implodeを確認してください。配列の値を、テーブルに値を挿入するmysqlクエリに入れます。
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
配列の値がテキスト値の場合、引用符を追加する必要があります
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";
mysql_query($query);
また、重複する値が必要ない場合は、「INto」を「IGNORE」に切り替えると、一意の値のみがテーブルに挿入されます。
データベースに保存する代わりに、ファイルに保存して、後で呼び出します。
多くのphpアプリが行うこと(sugarcmなど)は、var_exportを使用して配列のすべてのデータをファイルにエコーすることです。これは、構成データを保存するために使用するものです。
private function saveConfig() {
file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');
}
これはあなたのデータを保存するためのより良い方法だと思います!