Сохранить PHP-массив в MySQL?

Что такое хороший способ сохранить массив данных в одном поле 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;} .

Если нет, то сериализуйте и несериализуйте работу для всех случаев.

Лучший способ, который я нашел себе, – сохранить массив в виде строки данных с символами разделителя

 $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 или если вы используете 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']); 

Просто используйте функцию serialize PHP:

 <?php $myArray = new array('1', '2'); $seralizedArray = serialize($myArray); ?> 

Однако, если вы используете простые массивы, подобные тому, что вы можете также использовать implode и взрываться.

Сериализовать / Unserialize массив для хранения в БД

Посетите сайт http://php.net/manual/en/function.serialize.php.

Из руководства PHP:

Посмотрите в разделе «Возврат» на странице

Возвращает строку, содержащую представление значения байтового потока, которое можно хранить в любом месте.

Обратите внимание, что это двоичная строка, которая может включать в себя нулевые байты и должна храниться и обрабатываться как таковая. Например, вывод serialize () обычно должен храниться в поле BLOB в базе данных, а не в поле CHAR или TEXT.

Примечание. Если вы хотите хранить html в блобе, обязательно закодируйте его base64 или он может сломать функцию сериализации.

Пример кодирования:

 $YourSerializedData = base64_encode(serialize($theHTML)); 

$YourSerializedData теперь готов к сохранению в blob.

После получения данных из blob вам нужно base64_decode, а затем unserialize Пример декодирования:

 $theHTML = unserialize(base64_decode($YourSerializedData)); 

Сериализация и неэтеризация довольно распространены для этого. Вы также можете использовать JSON через json_encode и json_decode для менее специфичного для PHP формата.

Как уже упоминалось ранее – если вам не нужно искать данные в массиве, вы можете использовать serialize – но это только «php». Поэтому я бы рекомендовал использовать json_decode / json_encode – не только для производительности, но и для переносимости!

Я не знаю, почему все предлагают сериализацию массива.

Я говорю, что лучший способ – это поместить его в схему базы данных. Я понятия не имею (и вы не дали никаких подсказок) о фактическом семантическом значении данных в вашем массиве, но обычно есть два способа хранения таких последовательностей

 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 ) 

Недостатком первого метода является, очевидно, то, что если у вас много элементов в вашем массиве, работа с этой таблицей не будет самой изящной. Это также непрактично (возможно, но довольно неэлегантно – просто сделайте столбцы обнуляемыми) работать с последовательностями переменной длины.

Для второго метода вы можете иметь последовательности любой длины, но только одного типа. Вы можете, конечно, сделать этот тип 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); 

Кроме того, если вы не хотите дублировать значения, переключите «INto» в «IGNORE», и только уникальные значения будут вставлены в таблицу.

Вы можете сохранить свой массив как json.
есть документация для типа данных json: https://dev.mysql.com/doc/refman/5.7/en/json.html
Я думаю, что это лучшее решение, и поможет вам сохранить ваш код более читаемым, избегая безумных функций.
Я ожидаю, что это будет полезно для вас.

Yup, serialize / unserialize – это то, что я видел во многих проектах с открытым исходным кодом.

Вместо того, чтобы сохранять его в базу данных, сохраните его в файл и затем вызовите позже.

Многие приложения php (например, sugarcrm) должны просто использовать var_export для эхо-вывода всех данных массива в файл. Это то, что я использую для сохранения моих данных конфигурации:

 private function saveConfig() { file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';'); } 

Я думаю, что это лучший способ сохранить ваши данные!