Невозможно десериализовать объект после сохранения его сериализации в базе данных - PullRequest
4 голосов
/ 29 июня 2009

Я пытаюсь сохранить здесь сложный объект и делаю это путем сериализации объекта, на котором выполняется mysql_real_escape_string, и вставки его в базу данных mysql.

Тем не менее, когда я получаю его с помощью SQL-запроса - я использую Zend frameworks Zend_DB_Table здесь, но в любом случае - и когда я пытаюсь удалить и удалить сериализацию, я не получаю свой объект обратно. Я пытался просто десериализовать, не удаляя косые черты и все, кроме ничего работающего.


UPDATE

Это странно. Я сделал простую страницу, которая просто не сериализует сериализованный объект. Если я возьму сериализованную строку, когда она получена из базы данных, и десериализую ее через эту другую страницу, на которой есть только unserialize() - она ​​отлично работает, и я получаю свой объект обратно. Однако в коде, где по иронии судьбы я извлекаю строку и запускаю ту же самую опцию unserialize, она не работает!

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

Ответы [ 4 ]

16 голосов
/ 29 июня 2009

Вам, вероятно, сначала нужно выполнить кодировку base64:

$safe_string_to_store = base64_encode(serialize($data));

Затем, чтобы получить его обратно:

$date = unserialize(base64_decode($safe_string_to_store));

Попробуйте и дайте нам знать, если это работает.

(и не запускайте полоски на нем - в этом нет необходимости)

2 голосов
/ 29 июня 2009

Вы не должны запускать stripslashes на нем - база данных вернет вам правильную строку для ввода в unserialize.

Убедитесь, что у вас включены уведомления, и выведите строку перед тем, как отменить ее сериализацию - она ​​выглядит правильно?

1 голос
/ 21 августа 2015

Я настоятельно рекомендую вам использовать json_encode вместо сериализации. Однажды вы обнаружите, что пытаетесь использовать эти данные из другого места, не являющегося PHP, и хранение их в JSON делает их читаемыми везде; практически каждый язык поддерживает декодирование JSON и является общепризнанным стандартом. И что еще хуже, если вы используете base64, вы также делаете сериализованный контент нечитаемым из консоли клиента базы данных.

1 голос
/ 29 июня 2009

Вы должны быть в состоянии сделать следующее:

Предполагается, что MyTable является вашим экземпляром Zend_Db_Table_Abstract:

$t = new MyTable();
$n = $t->createRow();
$n->serializedfield = serialize($data);
$n->save();

и позвольте Zend DB позаботиться о побеге за вас.

Если вы делаете это через insert(), вам также не нужно ничего делать (вышеупомянутое использование insert())

В противном случае используйте $db->quoteInto() как

$db->quoteInto('INSERT INTO mytable (serializedfield) values (?)', serialize($data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...