它存储在数据库序列化后无法反序列化对象(Cannot unserialize object afte

2019-07-29 09:28发布

我想在这里保存一个复杂的对象,我做的是通过连载的对象中运行的mysql_real_escape_string它并将其插入到一个MySQL数据库。

然而,当我找回它运行的SQL查询-我使用Zend框架Zend_DB_Table在这里,但无论如何-当我尝试的stripslashes和反序列我没有得到我的对象了。 我试过,只是反序列化不剥斜线,而且几乎没有任何事情工作。


UPDATE

这很奇怪。 我做了一个简单的页面刚刚unserializes序列化对象。 如果我参加了序列化的字符串,因为它是从数据库中检索,并通过刚刚有这个其他页面反序列化它unserialize()就可以了-它完美的作品,我让我的对象返回。 然而,在代码中讽刺的是,我retriving绳子,我跑完全相同的反序列化的选项在那里,它不工作!

所以基本上没有什么不对的序列化的字符串 - 一些奇怪的原因,在我的应用程序也不会反序列化,但它unserializes其他地方,这是没有意义的。

Answer 1:

你可能需要通过base64编码首次运行它。

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

然后把它背出来:

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

尝试,并让我们知道,如果它的工作原理。

(并且不要在其上运行的stripslashes - 没有必要)



Answer 2:

你不应该运行stripslashes它-数据库会给你重新回到正确的字符串投入unserialize

请确保您有告示开启和echo字符串中,你反序列化之前 - 它是否正确?



Answer 3:

你应该能够只是做到以下几点:

假设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));


Answer 4:

我强烈建议你使用json_encode代替连载的。 有一天你会发现自己想使用来自另一个地方,是不是PHP的数据,并具有存储它JSON使其可读无处不在; 几乎所有的语言支持解码JSON,是一个很好配合建立标准。 而且是,即使你的base64更糟的是,你还让连载内容从数据库控制台客户端无法读取。



文章来源: Cannot unserialize object after storing it serialized in database