Вопрос по mysql, php – Невозможно десериализовать объект после сохранения его сериализации в базе данных

4

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

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

UPDATE

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

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

Ваш Ответ

4   ответа
1

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

16

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

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

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

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

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

2

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

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

error_reporting (E_NOTICE); Это включит уведомления, но также переопределит ваши текущие уровни сообщений об ошибках.uk.php.net/manual/en/book.errorfunc.php для получения дополнительной информации
Как включить уведомления? Ну, я пытался удалить и удалить сериализацию, а также десериализовать без удаления слешей, и это все еще не работает :( Ali
1

Предполагая, что 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));

Похожие вопросы