Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Unserialize()不工作,未捕获错误:调用布尔值上的成员函数_Php_Oop_Serialization - Fatal编程技术网

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

Php Unserialize()不工作,未捕获错误:调用布尔值上的成员函数,php,oop,serialization,Php,Oop,Serialization,我有3个类,我将它们序列化并保存到数据库中。其中2个工作正常,我能够检索对象并毫无问题地取消序列化。该类有9个属性。保存时,我将数组传递给类: $customer= new Customer($customerValues); $serializedCustomer = serialize($customer); $auftrag = new Auftrag($auftragValues); $serializedAuftrag = serialize($auftrag); C

我有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(“”)
$toDatabse = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format 
使用时:
print(“$res[0]['customer'],true)”我得到了对象,如上所示

除了特性外,这两个对象几乎完全相同。我注意到,Customer
中有一个“?”:
。这可能是个问题吗?或者我这里做错了什么?

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

如果您添加
错误报告(E_ALL)在取消序列化之前,您将看到错误消息,因为如果出现错误,取消序列化将抛出一个通知。序列化字符串确实有问题


我的猜测是,对象的值中有一些非ASCII符号,在保存并从数据库中读取后,由于字符集不匹配而丢失它们。如果您使用MySQL,此页面可能会有所帮助-

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


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

我得到
注意:unserialize():当我使用错误报告(E\u ALL)时,在
中328字节的偏移量14处出错;我删除了表并使用字符集utf-8再次创建了它,并创建了一个新类,但错误仍然存在。我真的不知道会发生什么cause@tmzafar,PHP序列化数据不是某些数据库的字符串安全值,因为它包含零字节(\0)。数据库可能不喜欢它们(顺便说一句,你没有说你正在使用什么数据库)。另外,使用UTF-8编码重新创建表可能还不够,原因有两个:1)除了DB编码之外,还有客户机编码(您的DB连接字符串);2) 文本可能包含需要4字节编码(MySQL中的utf8mb4)的表情符号。简单地说,最好的方法是在存储到数据库之前使用
base64\u encode()
将序列化字符串转换为ASCII安全字符串。和
base64_decode()
在取消序列化之前更好—不要在数据库中存储序列化对象,而是以关系数据库样式存储它们—不是客户对象,而是客户id,它是对另一个表的引用。