Сохранить PHP массив в MySQL?
каков хороший способ сохранить массив данных в одном поле mysql?
кроме того, как только я запрошу этот массив в таблице mysql, каков хороший способ вернуть его в форму массива?
Это сериализовать и восстановить ответ?
13 ответов:
нет хороший способ хранения массива в одном поле.
вам нужно изучить ваши реляционные данные и внести соответствующие изменения в вашу схему. См. пример ниже для ссылки на этот подход.
если вы должны сохраните массив в одно поле, затем
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();
The
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;}
.Если нет, то сериализовать и восстановить работу во всех случаях.
лучший способ, который я нашел для себя, это сохранить массив в виде строки данных с разделителями символов
$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
$array = explode("array_separator", $array_data);
обратите внимание, что это не работает с многомерными массивами и убедитесь, что ваш "array_separator" уникален и не существует значений в массиве.
будьте осторожны !!! Если вы просто возьмет данные формы и поместит в базу данных, вы будете в ловушке, потому что данные формы не являются SQL-безопасными ! вы должны обрабатывать значение формы с использования mysql_real_escape_string или если вы используете MySQLi mysqli:: 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']);
просто используйте функцию сериализации PHP:
<?php $myArray = array('1', '2'); $seralizedArray = serialize($myArray); ?>
однако, если вы используете простые массивы, подобные этому, вы можете также использовать implode и explode.Используйте пустой массив вместо нового.
сериализовать/восстановить массив для хранения данных в БД
посещение http://php.net/manual/en/function.serialize.php
из руководства PHP:
посмотреть в разделе "Возврат" на странице
возвращает строку, содержащую байт-потоковое представление значения, которое может быть сохранено в любом месте.
обратите внимание, что это двоичная строка, которая может включать нулевые байты, и должна храниться и обрабатываться как таковая. Например, сериализовать() выходные данные обычно должны храниться в поле BLOB в базе данных, а не в CHAR или текстовом поле.
Примечание: Если вы хотите сохранить html в blob, убедитесь, что base64 кодирует его или он может сломать функцию сериализации.
пример кодировки:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
теперь готов к хранению в blob.после получения данных из blob вам нужно base64_decode затем unserialize Пример декодирования:
$theHTML = unserialize(base64_decode($YourSerializedData));
сериализовать и восстановить довольно распространенная для этого. Вы также можете использовать JSON через json_encode и json_decode для менее специфичного для PHP формата.
Как упоминалось ранее - если вам не нужно искать данные в массиве, вы можете использовать сериализацию - но это "только php". Поэтому я бы рекомендовал использовать json_decode / json_encode - не только для производительности, но и переносимости !
Uhh, я не знаю, почему все предлагают сериализовать массив.
Я говорю, что лучший способ - это на самом деле вписать его в схему базы данных. Я понятия не имею (и вы не дали никаких подсказок) о фактическом семантическом значении данных в вашем массиве, но обычно есть два способа хранения таких последовательностей
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) для работы с последовательностями переменной длины.
для второго метода вы можете иметь последовательности любой длины, но только одного типа. Вы можете, конечно, сделать один тип varchar или что-то еще и сериализовать элементы вашего массива. Не самое лучшее, что можно сделать, но, безусловно, лучше, чем сериализация целого массив, верно?
в любом случае, любой из этих методов получает явное преимущество в возможности доступа к произвольному элементу последовательности, и вам не нужно беспокоиться о сериализации массивов и подобных уродливых вещах.
Что касается его возвращения. Ну, получить соответствующую строку / последовательность строк с запросом и, ну, использовать цикл.. верно?
Я бы предложил использовать implode / explode с символом, который, как вы знаете, не будет содержаться ни в одном из отдельных элементов массива. Затем сохраните его в SQL в виде строки.
проверьте функцию implode, так как значения находятся в массиве, вы хотите поместить значения массива в запрос mysql, который вставляет значения в таблицу.
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
Если значения в массиве являются текстовыми значениями, вам нужно будет добавить кавычки
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')"; mysql_query($query);
кроме того, если вы не хотите дублировать значения, переключите "В" на "игнорировать", и в таблицу будут вставлены только уникальные значения.
вы можете сохранить свой массив как json.
существует документация для типа данных json:https://dev.mysql.com/doc/refman/5.7/en/json.html
Я думаю, что это лучшее решение, и поможет вам сохранить ваш код более читабельным, избегая сумасшедших функций.
Я ожидаю, что это полезно для вас.
вместо сохранения его в базе данных, сохраните его в файл, а затем вызвать его позже.
то, что делают многие php-приложения (например, sugarcrm), - это просто использовать var_export для Эха всех данных массива в файл. Это то, что я использую, чтобы сохранить мои данные конфигурации:
private function saveConfig() { file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';'); }
Я думаю, что это лучший способ сохранить ваши данные!