【问题标题】:Cannot unserialize object after storing it serialized in database将对象存储在数据库中序列化后无法反序列化
【发布时间】:2010-11-06 16:33:02
【问题描述】:

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

但是,当我运行 sql 查询检索它时 - 我在这里使用 Zend 框架 Zend_DB_Table 但无论如何 - 当我尝试剥离和反序列化时,我没有取回我的对象​​。我试图在不剥离斜杠的情况下进行反序列化,但几乎没有任何效果。


更新

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

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

【问题讨论】:

    标签: php mysql zend-framework serialization


    【解决方案1】:

    我强烈建议您使用 json_encode 而不是序列化。总有一天,您会发现自己尝试使用来自 PHP 以外的其他地方的数据,并将其存储在 JSON 中使其在任何地方都可读;几乎每种语言都支持解码 JSON,并且是一个成熟的标准。更糟糕的是,如果你对它进行 base64,你还会使序列化的内容无法从你的数据库控制台客户端读取。

    【讨论】:

      【解决方案2】:

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

      假设 MyTable 是 Zend_Db_Table_Abstract 的实例:

      $t = new MyTable();
      $n = $t->createRow();
      $n->serializedfield = serialize($data);
      $n->save();
      

      并让 Zend DB 为您处理转义。

      如果您通过insert() 进行操作,您也不需要做任何事情(以上使用insert())

      否则使用$db->quoteInto()like

      $db->quoteInto('INSERT INTO mytable (serializedfield) values (?)', serialize($data));
      

      【讨论】:

        【解决方案3】:

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

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

        然后把它拿回来:

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

        尝试一下,如果它有效,请告诉我们。

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 如何打开通知?好吧,我尝试了剥离和反序列化以及反序列化而不剥离斜杠,但它仍然不起作用:(
          • error_reporting(E_NOTICE);这将启用通知,但也会覆盖您当前的错误报告级别。 uk.php.net/manual/en/book.errorfunc.php 了解更多信息
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-30
          • 1970-01-01
          • 2016-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-17
          相关资源
          最近更新 更多