PHP serialize и json

PHP serialize – метод превращения данных (строки, массива) в байт строку с возможностью последующего извлечения через unserialize. Ранее был популярен, но сейчас лучше использовать json:

  1. serialize работает только в php
  2. serialize из коробки имеет проблемы со спец. символами (пример ниже)

Ошибка “Notice: unserialize(): Error at offset 454707 of 455688 bytes in”

Варианты решения:

  1. переделать на json – самый простой и эффективный на практике
  2. использовать DECOCE – учитываем, что не работает с array
  3. использовать REGEXP для удаления “плохих” символов массово – можно потерять часть данных
  4. искать символ(ы)  по значению байта (455688) на которые ругается serialize через dd, sql в базу и прочие шаманства и удалять их направленно

json – по сути аналог serialize, только более стандартизирован и стабилен.

Пример передачи и приема массива между страницами:

  1. кодируем данные (htmlspecialchars нужен если передаем массив)
echo "<form method=\"post\">";
  $devices_encoded = htmlspecialchars(json_encode($devices));
  echo "<input type=\"hidden\" name=\"devices\" value=\"$devices_encoded\"/>";
echo "</form>";

2. принимаем на второй стороне

$devices = json_decode($_POST['devices']);

Ассоциированный массив передать так просто не получится  (или даже если ключи в массиве непоследовательны) – в результате json_encode будет создан object, не array. Удалить текущие ключи и сделать последовательно можно используя array_values() перед json encode.

Чтобы получить на выходе json_decode не object, а array, нужно добавить true во второй аргумент функции.

json_decode($res, true);

Leave a Reply