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



我有3个类,我将它们序列化并保存到数据库中。其中2个工作得很好,我可以毫无问题地检索对象并取消它们的序列化。有问题的类有9个属性。我将数组传递给类,同时保存:

$customer= new Customer($customerValues);
$serializedCustomer = serialize($customer);
$auftrag = new Auftrag($auftragValues);
$serializedAuftrag = serialize($auftrag);

Customer对象看起来像:

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

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

$toDatabse = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format 

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

根据PHP文档,如果字符串无效,unserialize将返回false。这就是在您的案例中发生的情况——$custArr不是Customer类的实例,因此出现了错误。

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

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

最新更新