Как хранить массивы в базе данных

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

Чтобы конвертировать любой массив (или объект) в строку в PHP, нужно вызвать функцию serialize:

$array = array( 1, 2, 3 );
$string = serialize( $array );
echo $string;

$string содержит строчную версию массива. Выше приведенный пример выведет следующее:

a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}

Чтобы конвертировать такую строку обратно в массив, надо использовать unserialize:

// $array будет содержать( 1, 2, 3 )
$array = unserialize( $string );

Теперь проведём конвертацию массива из 200 случайно генерированных целых чисел в диапазоне от 1 до 1000:

$array = array();
for( $i = 0; $i < 200; $i++ )
	$array[] = mt_rand( 1, 1000 );

$string = serialize( $array );
echo $string;

Пример выведет подобную строку:

a:200:{i:0;i:465;i:1;i:202;i:2; ... ;i:144;}

Данная строка может быть сохранена в базе данных и конвертирована в массив по мере надобности. Очень часто функция  base64_encode используется в сочетании с функцией serialize для хранения массивов:

$string = base64_encode( serialize( $array ) );

Зашифрованная строка может быть восстановлена в массив с помощью функции base64_decode:

$array = unserialize( base64_decode( $string ) );

К сожалению, такие строки могут иметь очень большой размер. В таком случае можно использовать функцию gzcompress для сжатия строки (размер сжатой строки существенно меньше):

$smallString = gzcompress( $string );

Перед использованием, такую строку надо вернуть к обычному виду с помощью функции gzuncompress.

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.lateralcode.com/store-array-database/
Перевел: Сергей Фастунов
Урок создан: 3 Сентября 2010
Просмотров: 89003
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 3 Сентября 2010 10:40
    Kesha_php
    Оч интересно)мне нада)сейчас делаю один проект и как раз нужно записывать массив в базу, я записываю с помощью implode(); он конвертирует массив в строку, а потом просто explode() перевожу из строки в массим)как пример записи массива в базу. Автору спасибо!
  • 3 Сентября 2010 19:24
    Sonic
    а как будет записан с помощью функции serialize многомерный массив?
  • 4 Сентября 2010 13:26
    Earlo
    недавно как раз ломал голову как массив хранить с опозанием урок вышел ))) Sonic, что мешает проверить добавить и посмотреть?
  • 11 Февраля 2011 04:14
    MJRamon ДобрыйПапочк
    Зачем хранить массивы в базе?
    • 22 Июля 2011 23:11
      Михаил Пешехонов
      А как ты будешь хранить, к примеру, кучу фотографий одого юзера? 100500 полей создавать ? photo 1 photo 2 photo 3 и т п
  • 24 Марта 2011 23:53
    xakepmega
    а я использую json_encode\decode
  • 5 Апреля 2011 17:54
    mortilar
    Я implode() использую. А массивы иногда надо, например список картинок присвоенных одной записи
  • 13 Мая 2011 14:13
    redmol
    После gzcompress нужно еще экранировать массив, а то после selecta из БД архив не разархивируется.
  • 1 Мая 2012 14:08
    sonrisa_feliz
    А помогите, пожалуйста, правильно создать массив и записать его в бд. Я получаю ссылку на изображение в переменную foto в цикле. Т.е. при
    $array= array($foto);
    в array попадает только последнее изображение.
  • 31 Мая 2012 15:03
    vova.pavlov
    Оч удобно при кэшировании сложных расчетов. Спасибо.
  • 29 Июля 2012 19:17
    VANEK18
    Подскажите, а как потом организовать поиск по полю с таким массивом запросом mysql, если я правильно понимаю, сначала необходимо обратно восстановить массив средствами php, но ведь для этого придется перебирать все записи в таблице?
  • 5 Октября 2012 10:46
    VANEK18
    Спасибо за ответ)
  • 27 Августа 2013 16:20
    sergeyk1980
    //В базу
    $a = array('1' => 1,'2' => '2'); //Создаю JSON
    $rods = json_encode($a);//Кодирую
    //Пишем в Mysql
    //Достаём из Mysql ( $Query= $db->loadAssoc() )
    $b = json_decode($Query['1'], true);
    // Итог - ассоциативный массив.
    
    мой способ. Joomla
  • 21 Сентября 2014 07:36
    Yosik
    Да, да, да!!! Супер статья, помогла справиться с решением вопроса
^ Наверх ^