Unserialize () не работает, ошибка Uncaught: вызов функции-члена в логическом - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть 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"?:. Может ли это быть проблемой? Или что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Я нашел решение, выполнив следующее:

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

, в то время как решение @astax также было правильным при указании на проблему. Но с помощью base64_encode это позволило безопасно сериализовать объект. Это предотвращает повреждение данных, поскольку base64 преобразует данные в ASCII, что может занять любое сопоставление.

0 голосов
/ 16 апреля 2020

Согласно PHP документации , unserialize возвращает false, если строка неверна. Это то, что происходит в вашем случае - $custArr не является экземпляром класса Customer, поэтому возникает ошибка.

Если вы добавите error_reporting(E_ALL); непосредственно перед десериализацией, вы увидите сообщение об ошибке, поскольку unserialize выдает уведомление в случае ошибки. С сериализованной строкой действительно что-то не так.

Я предполагаю, что в значениях объекта есть не-ASCII-символы, и вы теряете их после сохранения и чтения из базы данных из-за несовпадения набора символов. Если вы используете MySQL, эта страница может помочь - https://dev.mysql.com/doc/refman/8.0/en/charset.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...