Apa cara yang baik untuk menyimpan larik data ke satu bidang mysql?
Juga setelah saya menanyakan array itu di tabel mysql, apa cara yang baik untuk mengembalikannya ke bentuk array?
Apakah serialisasi dan unserialize jawabannya?
Tidak ada gunanya cara yang untuk menyimpan larik ke dalam satu bidang.
Anda perlu memeriksa data relasional Anda dan membuat perubahan yang sesuai pada skema Anda. Lihat contoh di bawah untuk referensi tentang pendekatan ini.
Jika Anda harus menyimpan array ke dalam satu bidang maka fungsi serialize()
dan unserialize()
akan melakukan triknya. Tetapi Anda tidak dapat melakukan kueri pada konten yang sebenarnya.
Sebagai alternatif dari fungsi serialisasi, ada juga json_encode()
dan json_decode()
.
Perhatikan array berikut
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
Untuk menyimpannya di database Anda perlu membuat tabel seperti ini
$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)
)');
Untuk bekerja dengan rekaman Anda bisa melakukan kueri seperti ini (dan ya ini adalah contoh, waspadalah!)
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();
The connect()
mengembalikan fungsi sumber daya koneksi mysql
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
Secara umum, ya, serialisasi dan unserialize adalah cara yang harus dilakukan.
Jika data Anda adalah sesuatu yang sederhana, menyimpan sebagai string yang dipisahkan koma mungkin akan lebih baik untuk ruang penyimpanan. Jika Anda mengetahui bahwa array Anda hanya berupa daftar angka, misalnya, Anda harus menggunakan implode / explode. Ini perbedaan antara 1,2,3
dana:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
.
Jika tidak, maka buat serial dan unserialize pekerjaan untuk semua kasus.
Cukup gunakan fungsi PHP serialisasi:
<?php $myArray = array('1', '2'); $seralizedArray = serialize($myArray); ?>
Namun, jika Anda menggunakan array sederhana seperti itu, Anda sebaiknya menggunakan implode dan meledak. Gunakan array kosong, bukan baru.
sumber
Serialize / Unserialize array untuk penyimpanan di DB
Kunjungi http://php.net/manual/en/function.serialize.php
Dari Manual PHP:
Lihat di bawah "Kembali" di halaman
Mengembalikan string yang berisi representasi aliran byte dari nilai yang dapat disimpan di mana saja.
Perhatikan bahwa ini adalah string biner yang mungkin menyertakan byte nol, dan perlu disimpan serta ditangani seperti itu. Misalnya, keluaran serialize () umumnya harus disimpan dalam bidang BLOB dalam database, daripada bidang CHAR atau TEXT.
Catatan: Jika Anda ingin menyimpan html ke dalam blob, pastikan untuk menyandikannya base64 atau dapat merusak fungsi serialisasi.
Contoh pengkodean:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
sekarang siap disimpan dalam blob.Setelah mendapatkan data dari blob Anda perlu base64_decode lalu unserialize Contoh decoding:
$theHTML = unserialize(base64_decode($YourSerializedData));
sumber
Cara terbaik, yang saya temukan sendiri adalah menyimpan array sebagai string data dengan karakter pemisah
$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 . "');";
Anda kemudian dapat mencari data, disimpan dalam array Anda dengan kueri sederhana
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
gunakan fungsi explode () untuk mengubah string "array_data" menjadi array
$array = explode("array_separator", $array_data);
Perhatikan bahwa ini tidak berfungsi dengan larik multidimensi dan pastikan bahwa "pemisah_ larik" Anda unik dan tidak ada dalam nilai larik.
Hati-hati !!! jika Anda hanya akan mengambil data formulir dan memasukkannya ke dalam database, Anda akan terjebak, karena data formulir tersebut tidak aman untuk SQL! Anda harus menangani nilai formulir Anda dengan mysql_real_escape_string atau jika Anda menggunakan MySQLi mysqli :: real_escape_string atau jika nilainya adalah integer atau boolean cast (int) (boolean) pada mereka
$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']);
sumber
Serialisasi dan unserialize cukup umum untuk itu. Anda juga dapat menggunakan JSON melalui json_encode dan json_decode untuk format yang tidak terlalu spesifik untuk PHP.
sumber
Seperti disebutkan sebelumnya - Jika Anda tidak perlu mencari data di dalam array, Anda dapat menggunakan serialize - tetapi ini "hanya php". Jadi saya akan merekomendasikan untuk menggunakan json_decode / json_encode - tidak hanya untuk kinerja tetapi juga untuk keterbacaan dan portabilitas (bahasa lain seperti javascript dapat menangani data json_encoded).
sumber
Uhh, saya tidak tahu mengapa semua orang menyarankan serialisasi array.
Saya katakan, cara terbaik adalah dengan menyesuaikannya dengan skema database Anda. Saya tidak tahu (dan Anda tidak memberi petunjuk) tentang arti semantik sebenarnya dari data dalam array Anda, tetapi umumnya ada dua cara untuk menyimpan urutan seperti itu
create table mydata ( id int not null auto_increment primary key, field1 int not null, field2 int not null, ... fieldN int not null )
Dengan cara ini Anda menyimpan array Anda dalam satu baris.
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 )
Kerugian dari metode pertama adalah, jelas, jika Anda memiliki banyak item dalam array Anda, bekerja dengan tabel itu bukanlah hal yang paling elegan. Ini juga tidak praktis (mungkin, tetapi juga cukup tidak elegan - cukup buat kolom menjadi nullable) untuk bekerja dengan urutan dengan panjang variabel.
Untuk metode kedua, Anda dapat memiliki urutan dengan panjang berapa pun, tetapi hanya satu jenis. Anda dapat, tentu saja, membuat satu jenis varchar atau sesuatu dan membuat serial item dari array Anda. Bukan hal terbaik untuk dilakukan, tetapi tentu saja lebih baik, daripada membuat serial seluruh array, bukan?
Apa pun itu, salah satu metode ini mendapatkan keuntungan yang jelas karena dapat mengakses elemen urutan yang sewenang-wenang dan Anda tidak perlu khawatir tentang serialisasi array dan hal-hal buruk seperti itu.
Adapun mendapatkannya kembali. Nah, dapatkan baris / urutan baris yang sesuai dengan kueri dan, baik, gunakan loop .. bukan?
sumber
Anda dapat menyimpan array Anda sebagai json.
ada dokumentasi untuk tipe data json: https://dev.mysql.com/doc/refman/5.7/en/json.html
Saya pikir ini adalah solusi terbaik, dan akan membantu Anda menjaga kode Anda lebih mudah dibaca dengan menghindari fungsi gila .
Saya berharap ini bermanfaat untuk Anda.
sumber
Yup, serialize / unserialize adalah hal yang paling sering saya lihat di banyak proyek open source.
sumber
Saya akan menyarankan menggunakan implode / meledak dengan karakter yang Anda tahu tidak akan terkandung dalam salah satu item array individu. Kemudian simpan dalam SQL sebagai string.
sumber
periksa fungsi implode, karena nilainya ada dalam array, Anda ingin memasukkan nilai array ke dalam kueri mysql yang memasukkan nilai ke dalam tabel.
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
Jika nilai dalam larik adalah nilai teks, Anda perlu menambahkan tanda kutip
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')"; mysql_query($query);
Selain itu, jika Anda tidak ingin nilai duplikat, alihkan "IN ke" menjadi "IGNORE" dan hanya nilai unik yang akan dimasukkan ke dalam tabel.
sumber
Anda dapat memasukkan objek berseri (array) ke mysql, contoh
serialize($object)
dan Anda dapat menghapus contoh objekunserialize($object)
sumber
Daripada menyimpannya ke database, simpan ke file lalu panggil nanti.
Apa yang dilakukan banyak aplikasi php (seperti sugarcrm) adalah menggunakan var_export untuk menggemakan semua data array ke file. Inilah yang saya gunakan untuk menyimpan data konfigurasi saya:
private function saveConfig() { file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';'); }
Saya pikir ini adalah cara yang lebih baik untuk menyimpan data Anda!
sumber