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

我有 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"?:。这可能是个问题吗?或者我在这里做错了什么?


四季花海
浏览 84回答 2
2回答

郎朗坤

我通过执行以下操作找到了解决方案:$toDatabse = base64_encode(serialize($data));&nbsp; // Save to database$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format&nbsp;而@astax 的解决方案在指出问题方面也是正确的。但是通过使用 base64_encode,它确保安全地序列化对象。这可以防止数据被破坏,因为 base64 将数据转换为任何排序规则都可以采用的 ASCII。

慕莱坞森

根据PHP 文档,如果字符串无效则unserialize返回。false这就是您的情况 -$custArr不是Customer类的实例,因此是错误。如果您error_reporting(E_ALL);在 unserialize 之前添加,您将看到错误消息,因为 unserialize 会在出现错误时发出通知。序列化后的字符串确实有问题。我的猜测是对象的值中有一些非 ASCII 符号,并且由于字符集不匹配而在保存和从数据库读取后丢失了它们。如果您使用 MySQL,此页面可能会有所帮助 -&nbsp;https://dev.mysql.com/doc/refman/8.0/en/charset.html
打开App,查看更多内容
随时随地看视频慕课网APP