为了账号安全,请及时绑定邮箱和手机立即绑定

Unserialize() 不工作,未捕获错误:调用布尔值上的成员函数

Unserialize() 不工作,未捕获错误:调用布尔值上的成员函数

PHP
四季花海 2022-12-23 14:44:36
我有 3 个类,我将它们序列化并保存到数据库中。其中 2 个很好,我能够毫无问题地检索对象并反序列化它们。有问题的类有 9 个属性。我将一个数组传递给类,同时保存:  $customer= new Customer($customerValues);  $serializedCustomer = serialize($customer);  $auftrag = new Auftrag($auftragValues);  $serializedAuftrag = serialize($auftrag);客户对象看起来像:O:5:"Customer"?:{s:9:"*anrede";s:4:"Herr";s:7:"*name";s:11:"ABC";s:8:"*firma";s:11:"test";s:10:"*strasse";s:16:"teststr. 33";s:6:"*plz";s:5:"1234";s:8:"*stadt";s:12:"testcity";s:8:"*mobil";s:12:"0123456789";s:10:"*telefon";s:12:"0123456789";s:8:"*email";s:18:"test@mail.com";}和 Auftrag 对象:O:7:"Auftrag":37:{s:14:"*auftrag_typ";s:7:"Angebot";s:9:"*breite";s:3:"2.5";s:8:"*tiefe";s:3:"4.5";s:8:"*hoehe";s:4:"1.00".....我在两个类中都有以下功能:public function getProperties() {      $properties = get_object_vars($this);      return $properties;    }然后我从数据库中获取数据并反序列化它们:require_once($_SERVER['DOCUMENT_ROOT'] . '/php/Customer.php');require_once($_SERVER['DOCUMENT_ROOT'] . '/php/Auftrag.php');$res = $dbc->fetchAllResults(PDO::FETCH_ASSOC);$custArr = unserialize($res[0]['customer']);$auftragArr = unserialize($res[0]['auftrag']);$customer= $custArr->getProperties();$auftrag = $auftragArr->getProperties();当我打印时:print("<pre>".print_r($customer,true)."</pre>"); 我得到一个错误:Fatal error: Uncaught Error: Call to a member function getProperties() on boolean in,但它工作得很好(我得到一个数组),当我打印时:print("<pre>".$auftrag,true)."</pre>"); 当我使用时:print("<pre>".$res[0]['customer'],true)."</pre>");我得到了对象,就像上面一样。除了属性外,这两个对象几乎相同。我注意到,有一个“?” 在客户中"Customer"?:。这可能是个问题吗?或者我在这里做错了什么?
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我通过执行以下操作找到了解决方案:


$toDatabse = base64_encode(serialize($data));  // Save to database

$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format 

而@astax 的解决方案在指出问题方面也是正确的。但是通过使用 base64_encode,它确保安全地序列化对象。这可以防止数据被破坏,因为 base64 将数据转换为任何排序规则都可以采用的 ASCII。


查看完整回答
反对 回复 2022-12-23
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

根据PHP 文档,如果字符串无效则unserialize返回。false这就是您的情况 -$custArr不是Customer类的实例,因此是错误。

如果您error_reporting(E_ALL);在 unserialize 之前添加,您将看到错误消息,因为 unserialize 会在出现错误时发出通知。序列化后的字符串确实有问题。

我的猜测是对象的值中有一些非 ASCII 符号,并且由于字符集不匹配而在保存和从数据库读取后丢失了它们。如果您使用 MySQL,此页面可能会有所帮助 - https://dev.mysql.com/doc/refman/8.0/en/charset.html


查看完整回答
反对 回复 2022-12-23
  • 2 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信