【问题标题】:Why does unserialize in PHP keep returning false?为什么 PHP 中的反序列化总是返回 false?
【发布时间】:2009-07-02 07:35:36
【问题描述】:

我刚刚编写了世界上最简单的脚本,但我仍然无法让它工作,这很奇怪。

我想使用 jQuery 来捕获一些输入字段值并使用 jQuery 的serialize() 将它们序列化。然后我将序列化的字符串发送到服务器以对其进行反序列化。这是我从 jQuery 中序列化得到的输出,这是我发送到服务器的。

field1=value1&field2=value2&field3=value3

这是函数,

public function unserialize_input()
{
    $str = $this->input->post("user_values");
    $unserialized = unserialize($str);
    var_dump($unserialized);
}

正如我所说,如果我使用“echo $str;”我得到“field1=value1&field2=value2&field3=value3”,所以字符串应该是不可序列化的。但是,我总是收到相同的错误消息,var_dump($unserialized); 总是返回 bool(false)。

这是我从 CodeIgniter 收到的错误消息,我正在使用 PHP 框架。

Severity: Notice
Message: unserialize() [<ahref='function.unserialize'>function.unserialize</a>]: Error at offset 0 of 41 bytes

bool(false) 

我目前正在使用MAMP 并在本地运行它。我读到了一些关于magic_quotes_gpc 关闭的内容可能会在本地导致这种情况,但它已启用。可能有什么问题?

【问题讨论】:

    标签: php serialization


    【解决方案1】:

    您使用了错误的 PHP 函数。你应该改用parse_str

     parse_str($str, $unserialized);
    

    【讨论】:

      【解决方案2】:

      PHP 的 serializeunserialize 破坏和构造 PHP 对象/数组/值。

      jQuery serialize 将表单序列化为 POST 字符串,这对于执行 Ajax 调用非常方便。 post 字符串在 PHP 中不是有效的序列化字符串,无法重构为 PHP 混合值,因此返回 false。

      【讨论】:

      • 好的,这就是原因。谢谢你。您对我如何处理 PHP 脚本中的数据有什么建议吗?正如您所说,使用 ajax 调用在 jQuery 中将输入值作为序列化字符串发送非常方便。但是无论如何我可以将序列化的字符串转换回php数组或php可以轻松处理的其他数据类型,例如将数据插入数据库。
      • 如果您使用 ajax 发送数据,它将在 $_GET 或 $_POST 中,具体取决于您用于 ajax 的方法
      • 或者留在您选择的技术堆栈中,您可以使用 jQuery 使用 $.post 进行 ajax 调用,并将数据作为 JSON 发送。 CodeIgniter 可以将 JSON 重构为 php 对象/数组/值检查 json 助手:blog.jdbartlett.com/2007/09/codeigniter-servicesjson.html。您可以将 JSON 视为 serialze() 的通用格式,并以某种方式进行反序列化。
      【解决方案3】:

      这会有点模糊,因为我不太了解 jQuery,但是 jQuery 序列化的字符串可能与 PHP 略有不同吗?如果是这样,那么这将导致您看到的错误消息。

      【讨论】:

      • 这可能是真的,但是,字符串看起来很好我认为“field1=value1&field2=value2&field3=value3”即使我用 PHP 或 jQuery 生成它看起来还可以,不应该是不可序列化的?还是我弄错了?