Php 在数据库中存储序列化后,无法取消序列化对象

Php 在数据库中存储序列化后,无法取消序列化对象,php,mysql,zend-framework,serialization,Php,Mysql,Zend Framework,Serialization,我试图在这里存储一个复杂的对象,通过序列化在其上运行mysql\u real\u escape\u string的对象并将其插入mysql数据库来实现 然而,当我运行sql查询检索它时-我在这里使用ZendframeworksZend\u DB\u Table,但无论如何-当我尝试剥离斜杠和取消序列化时,我不会拿回我的对象。我试着在不剥去斜线的情况下进行非序列化,但什么都不起作用 更新 这很奇怪。我制作了一个简单的页面,它只是取消序列化对象的序列化。如果我在从数据库检索序列化字符串时,通过另一

我试图在这里存储一个复杂的对象,通过序列化在其上运行
mysql\u real\u escape\u string
的对象并将其插入mysql数据库来实现

然而,当我运行sql查询检索它时-我在这里使用
Zend
frameworks
Zend\u DB\u Table
,但无论如何-当我尝试剥离斜杠和取消序列化时,我不会拿回我的对象。我试着在不剥去斜线的情况下进行非序列化,但什么都不起作用


更新

这很奇怪。我制作了一个简单的页面,它只是取消序列化对象的序列化。如果我在从数据库检索序列化字符串时,通过另一个页面取消序列化,该页面上只有一个
unserialize()。然而,具有讽刺意味的是,在代码中,我正在检索字符串,并在那里运行完全相同的unserialize选项,它不起作用


因此,序列化字符串基本上没有问题-出于某种奇怪的原因,它不会在我的应用程序中取消序列化,但它在其他地方取消序列化,这是没有意义的。

您不应该在其上运行
stripslashes
,数据库将返回正确的字符串以放入
取消序列化


在取消序列化之前,请确保已打开通知并回显字符串-它看起来正确吗?

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

$safe_string_to_store = base64_encode(serialize($data));
然后要把它拿出来:

$date = unserialize(base64_decode($safe_string_to_store));
试试看,让我们知道它是否有效


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

您应该能够执行以下操作:

假设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_编码而不是序列化。有朝一日,您会发现自己试图使用来自另一个非PHP的地方的数据,并将其存储在JSON中,使其在任何地方都可读;几乎每种语言都支持解码JSON,并且是一个完善的标准。更糟糕的是,如果使用base64,还会使序列化内容无法从数据库控制台客户端读取。

如何打开通知?我已经尝试过剥离斜杠和取消序列化,以及在不剥离斜杠的情况下取消序列化,但仍然不起作用:(错误报告(E_通知);这将启用通知,但也会覆盖当前的错误报告级别。有关详细信息