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

Что такое хороший способ сохранить массив данных в одном поле mysql?

Также, как только я запрошу для этого массива в таблице mysql, что это хороший способ вернуть его в форму массива?

Сериализовывает и нетериализирует ответ?

Ответ 1

Невозможно сохранить массив в одном поле.

Вам необходимо изучить ваши реляционные данные и внести соответствующие изменения в вашу схему. См. Пример ниже для ссылки на этот подход.

Если вы должны сохранить массив в одном поле, 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;
}

Ответ 2

Как правило, да, сериализовать и неэтериализовать - это путь.

Если ваши данные являются простыми, однако сохранение в виде строки с разделителями-запятыми, вероятно, будет лучше для хранения. Если вы знаете, что ваш массив будет просто списком чисел, например, тогда вы должны использовать implode/explode. Это разница между 1,2,3 и a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}.

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

Ответ 3

Сериализация/десериализация массива для хранения в БД

Посетите 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, а затем удалить его. Пример декодирования:

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

Ответ 4

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

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

Однако, если вы используете простые массивы, подобные этому, вы можете также использовать implode и explode. Использовать пустой массив вместо new.

Ответ 5

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

$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']);

Ответ 6

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

Ответ 7

Как упоминалось ранее - если вам не нужно искать данные в массиве, вы можете использовать serialize - но это "только php". Поэтому я бы рекомендовал использовать json_decode/json_encode - не только для производительности, но также для удобства чтения и переносимости (другие языки, такие как javascript, могут обрабатывать данные json_encoded).

Ответ 8

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
)

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

Для второго метода вы можете иметь последовательности любой длины, но только одного типа. Вы можете, конечно, сделать этот тип varchar или что-то еще и сериализовать элементы вашего массива. Не лучшая вещь, но, конечно, лучше, чем сериализация всего массива, правильно?

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

Как вернуть его. Ну, возьмите соответствующую строку/последовательность строк с запросом и, ну, используйте цикл. Right?

Ответ 9

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

Ответ 10

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

Ответ 11

проверьте функцию implode, так как значения находятся в массиве, вы хотите поместить значения массива в запрос mysql, который вставляет значения в таблицу.

$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";

Если значения в массиве являются текстовыми значениями, вам нужно будет добавить кавычки

$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";

mysql_query($query);

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

Ответ 12

Я бы предложил использовать implode/explode с символом, который, как вы знаете, не будет содержаться ни в одном из отдельных элементов массива. Затем сохраните его в SQL как строку.

Ответ 13

вы можете вставить сериализованный объект (массив) в mysql, пример serialize($object), и вы можете отменить анализ примера объекта unserialize($object)

Ответ 14

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

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

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

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