我正在尝试在这里存储一个复杂的对象,并通过序列化运行mysql_real_escape_string
的对象并将其插入到mysql数据库中来实现。
然而,当我检索它运行sql查询时 - 我在这里使用Zend
框架Zend_DB_Table
但是无论如何 - 当我尝试使用striplashes并反序列化时,我不会得到我的对象。我试图在没有剥离斜线的情况下进行反序列化,并且除了没有工作之外的所有工作。
更新
这很奇怪。我做了一个简单的页面,它只是反序列化一个序列化的对象。如果我从数据库中检索序列化字符串并通过其上只有unserialize()
的其他页面对其进行反序列化 - 它完美地运行并且我将对象恢复。但是在具有讽刺意味的代码中,我正在重新获取字符串并且我在那里运行完全相同的unserialize选项,它不起作用!
所以基本上序列化的字符串没有任何问题 - 出于某些奇怪的原因,它不会在我的应用程序中反序列化它,但它会在其他地方反序列化,这没有任何意义。
答案 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,并且是一个很好的标准。更糟糕的是,如果你使用它,你也会使数据库控制台客户端无法读取序列化内容。