Я пытаюсь хранить сложный объект здесь, и делаю это, сериализуя объект, на котором запущен mysql_real_escape_string
и вставляя его в базу данных mysql.
Однако, когда я возвращаю его, выполняя sql-запрос – я использую Zend
рамки Zend_DB_Table
здесь, но в любом случае – и когда я пытаюсь stripslashes и unserialize, я не возвращаю свой объект. Я пробовал просто неэтериализовать, не снимая слэш, и все, кроме тех, кто ничего не работает.
ОБНОВИТЬ
Это странно. Я сделал простую страницу, которая просто не инициализирует сериализованный объект. Если я возьму сериализованную строку, поскольку она извлекается из базы данных и неэтериализует ее с помощью этой другой страницы, на которой есть только unserialize()
она отлично работает, и я возвращаю свой объект. Однако в коде, где по иронии судьбы я возвращаю строку, и я запускаю ту же самую опцию unserialize, ее не работает!
Таким образом, в сериализованной строке нет ничего плохого – по какой-то странной причине она не будет отказываться от нее в моем приложении, но она не выполняет никаких операций в другом месте, это не имеет смысла.
Вероятно, вам сначала нужно запустить его с помощью кодировки base64:
$safe_string_to_store = base64_encode(serialize($data));
Затем, чтобы вернуть его:
$date = unserialize(base64_decode($safe_string_to_store));
Попробуйте это и сообщите нам, если это сработает.
(и не запускать на них пластыри – нет необходимости)
Вы не должны запускать stripslashes
на нем – база данных вернет вам правильную строку, которая будет помещена в unserialize
.
Удостоверьтесь, что у вас есть уведомления и эхо строки, прежде чем вы несериализуете его – это выглядит правильно?
Вы должны просто сделать следующее:
Предполагая, что MyTable является вашим экземпляром Zend_Db_Table_Abstract:
$t = new MyTable(); $n = $t->createRow(); $n->serializedfield = serialize($data); $n->save();
и пусть Zend DB позаботится об эвакуации для вас.
Если вы делаете это через insert()
, вам также не нужно ничего делать (в приведенном выше insert()
используется insert()
)
В противном случае используйте $db->quoteInto()
как
$db->quoteInto('INSERT INTO mytable (serializedfield) values (?)', serialize($data));
Я настоятельно рекомендую вам использовать json_encode вместо сериализации. В какой-то день вы обнаружите, что пытаетесь использовать эти данные из другого места, которое не является PHP, и его хранение в JSON делает его доступным для чтения везде; практически каждый язык поддерживает декодирование JSON и является хорошо стабильным стандартом. И еще хуже, если вы используете base64, вы также делаете сериализованный контент нечитаемым из своего клиента консоли базы данных.