在数据库中存储序列化后,无法对对象进行反序列化

时间:2009-06-29 13:10:41

标签: php mysql zend-framework serialization

我正在尝试在这里存储一个复杂的对象,并通过序列化运行mysql_real_escape_string的对象并将其插入到mysql数据库中来实现。

然而,当我检索它运行sql查询时 - 我在这里使用Zend框架Zend_DB_Table但是无论如何 - 当我尝试使用striplashes并反序列化时,我不会得到我的对象。我试图在没有剥离斜线的情况下进行反序列化,并且除了没有工作之外的所有工作。


更新

这很奇怪。我做了一个简单的页面,它只是反序列化一个序列化的对象。如果我从数据库中检索序列化字符串并通过其上只有unserialize()的其他页面对其进行反序列化 - 它完美地运行并且我将对象恢复。但是在具有讽刺意味的代码中,我正在重新获取字符串并且我在那里运行完全相同的unserialize选项,它不起作用!

所以基本上序列化的字符串没有任何问题 - 出于某些奇怪的原因,它不会在我的应用程序中反序列化它,但它会在其他地方反序列化,这没有任何意义。

4 个答案:

答案 0 :(得分:16)

您可能需要先通过base64编码运行它:

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

然后把它拿回来:

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

尝试并告知我们是否有效。

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

答案 1 :(得分:2)

您不应该在其上运行stripslashes - 数据库会返回正确的字符串以放入unserialize

确保打开通知并在反序列化之前回显字符串 - 它看起来是否正确?

答案 2 :(得分: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));

答案 3 :(得分:1)

我强烈建议您使用json_encode而不是serialize。有一天,你会发现自己试图从另一个非PHP的地方使用这些数据并将其存储在JSON中,这使得它在任何地方都可读;几乎每种语言都支持解码JSON,并且是一个很好的标准。更糟糕的是,如果你使用它,你也会使数据库控制台客户端无法读取序列化内容。