【问题标题】:php unserialize returns falsephp反序列化返回false
【发布时间】:2017-06-19 06:34:00
【问题描述】:

我有以下问题。我正在检索一个 mysql 文本字段,它是发票的序列化文本。我正在从事 2 个不同的项目。两者都有相同版本的 PHP。数据已从 db 导出和导入到 db。如果我 var_dump 来自 db1 的数据,它会告诉我它的长度是 x。当我在 db2 中做同样的事情时,我得到 x+2

字符串(595) "a:3:{s:11:"userdetails";a:20:{s:4:"name";s:3:"bas";s:8:"lastname";s:7:"schmitz" ;s:5:"email";s:17:"email@test.de";s:6:"street";s:11:"f�rstenwall";s:7:"street2";s:0 :"";s:7:"公司";s:0:"";s:3:"zip";s:5:"40215";s:9:"住宅";s:10:"d� 塞尔多夫";s:7:"国家";s:7:"德国";s:5:"电话";s:7:"3033185";s:3:"传真";s:0:""; s:10:"customerID";i:202771;s:2:"nr";s:3:"228";s:6:"region";s:3:"nrw";s:10:"phone_code ";s:3:"211";s:8:"fax_code";s:0:"";s:10:"称呼";s:2:"先生";s:5:"销售";s :0:"";s:12:"country_code";s:0:"";s:10:"vat_number";s:0:"";}s:6:"域";s:15:" bas-schmitz2.de";s:10:"has_domain";b:1;}"


字符串(597) "a:3:{s:11:"userdetails";a:20:{s:4:"name";s:3:"bas";s:8:"lastname";s:7:"schmitz" ;s:5:"email";s:17:"email@test.de";s:6:"street";s:11:"fürstenwall";s:7:"street2";s:0:" ";s:7:"公司";s:0:"";s:3:"zip";s:5:"40215";s:9:"住宅";s:10:"杜塞尔多夫";s :7:"国家";s:7:"德国";s:5:"电话";s:7:"3033185";s:3:"传真";s:0:"";s:10: "customerID";i:202771;s:2:"nr";s:3:"228";s:6:"region";s:3:"nrw";s:10:"phone_code";s: 3:"211";s:8:"fax_code";s:0:"";s:10:"称呼";s:2:"先生";s:5:"销售";s:0:" ";s:12:"country_code";s:0:"";s:10:"vat_number";s:0:"";}s:6:"domain";s:15:"bas-schmitz2。 de";s:10:"has_domain";b:1;}"

在粘贴这些内容时,我可以看到显示日耳曼字符时存在差异

知道为什么会这样吗?

【问题讨论】:

  • 两个数据库中的字符集/编码是否相同?
  • latin1_swedish_ci
  • 您为什么使用瑞典语字符集并期望得到正确的结果?使用 utf8(甚至更好,utf8mb4)来防止这样的事情。还要确保您输出 utf8 并且您的文件也设置了正确的字符集。
  • @user1840302 您的序列化字符串已损坏。例如,email@test.de 的字符串长度为 13,但您的序列化字符串已声明为 17。因此,PHP 无法反序列化损坏的字符串。

标签: php mysql serialization


【解决方案1】:

serialize() 的输出不能作为纯文本处理:

返回值

返回一个字符串,其中包含一个字节流表示的值 可以存放在任何地方。

请注意,这是一个可能包含空字节的二进制字符串,并且 需要这样存储和处理。例如,序列化() 输出通常应存储在数据库中的BLOB 字段中, 而不是 CHARTEXT 字段。

因此,您的数据首先已损坏。

如果您无法更改数据库设计(这将是正确的解决方法),您需要将序列化数据重新编码为纯文本编码,例如 Base64:

$encoded = base64_encode(serialize($foo));
$decoded = unserialize(base64_decode($encoded));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多