我想在这里保存一个复杂的对象,我做的是通过连载的对象中运行的mysql_real_escape_string
它并将其插入到一个MySQL数据库。
然而,当我找回它运行的SQL查询-我使用Zend
框架Zend_DB_Table
在这里,但无论如何-当我尝试的stripslashes和反序列我没有得到我的对象了。 我试过,只是反序列化不剥斜线,而且几乎没有任何事情工作。
UPDATE
这很奇怪。 我做了一个简单的页面刚刚unserializes序列化对象。 如果我参加了序列化的字符串,因为它是从数据库中检索,并通过刚刚有这个其他页面反序列化它unserialize()
就可以了-它完美的作品,我让我的对象返回。 然而,在代码中讽刺的是,我retriving绳子,我跑完全相同的反序列化的选项在那里,它不工作!
所以基本上没有什么不对的序列化的字符串 - 一些奇怪的原因,在我的应用程序也不会反序列化,但它unserializes其他地方,这是没有意义的。
你可能需要通过base64编码首次运行它。
$safe_string_to_store = base64_encode(serialize($data));
然后把它背出来:
$date = unserialize(base64_decode($safe_string_to_store));
尝试,并让我们知道,如果它的工作原理。
(并且不要在其上运行的stripslashes - 没有必要)
你不应该运行stripslashes
它-数据库会给你重新回到正确的字符串投入unserialize
。
请确保您有告示开启和echo字符串中,你反序列化之前 - 它是否正确?
你应该能够只是做到以下几点:
假设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));
我强烈建议你使用json_encode代替连载的。 有一天你会发现自己想使用来自另一个地方,是不是PHP的数据,并具有存储它JSON使其可读无处不在; 几乎所有的语言支持解码JSON,是一个很好配合建立标准。 而且是,即使你的base64更糟的是,你还让连载内容从数据库控制台客户端无法读取。