Intereting Posts
PHPMailer – AddAttachment не работает как конвертировать www.example.com/posts/123 в example.com/posts/123? Загрузка шаблона сопоставления файлов с использованием phpseclib Ошибка jQuery 501 (Неподдерживаемый метод ('POST')) Общаться с кассовым ящиком с веб-сайта Простая математика с десятичными знаками в PHP Curl: получить данные UTF-8 с сайта с неправильной кодировкой Ошибка «function» mb_output_handler «не найден» в Laravel fullcalendar: есть способ вызвать dayRender только после того, как я загружу свои события через функцию событий PHP MYSQL PDO -> Неустранимая ошибка 23000, хотя существует специальная процедура Установление подключения к базе данных в php с использованием одноэлементного класса PHP разные односторонние хэши для защиты паролем Как получить все возможные комбинации многомерного массива Разверните Laravel 5, используя только FTP на общем хостинге индивидуальное значение в цикле

Невозможно выполнить повторный инициализацию объекта после его сохранения в базе данных

Я пытаюсь хранить сложный объект здесь, и делаю это, сериализуя объект, на котором запущен 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, вы также делаете сериализованный контент нечитаемым из своего клиента консоли базы данных.