Не может десериализовать строку в php - PullRequest
0 голосов
/ 26 февраля 2012

Да, я знаю.Я вижу много вопросов об этом.

Но никто не работает для меня до сих пор.

У меня есть блог в Wordpress, который использует сериализованные данные для хранения некоторых пользовательских полей.Это прекрасно работает, но когда я переместил весь блог в другую папку, все сериализованные данные собирались из WordPress (но он все еще находится в базе данных). Итак, WordPress не обнаружил его.

Теперь ... я 'Я пытаюсь понять, почему не работает.В конце ... я просто подумал, ну, я собираюсь сделать код для получения сериализованных данных, и он будет работать.

Теперь я потерян, у меня есть это:

$data = 'a:7:{s:4:"zoom";s:2:"18";s:8:"latitude";s:8:"41.37233";s:9:"longitude";s:7:"1.04283";s:11:"address_one";s:16:"Finca Riudabella";s:11:"address_two";s:33:" s/n - 43430 Vimbodí (Tarragona)";s:3:"pin";s:77:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";s:6:"bg_img";s:0:"";}';
$data = "a:7:{s:4:1}";
$data = trim($data);
var_dump($data);
var_dump(unserialize($data));

Я попытался с исходной сериализованной строкой из базы данных (первая строка) и возвращает false и ошибку.Я сделал одно немного проще и говорю то же самое.

Моя ошибка:

Notice: unserialize() [function.unserialize]: Error at offset 5 of 11 bytes in C:\xampp\htdocs\unser.php on line 6
bool(false) 

Итак, я не знаю, почему я не могу получить данные из строки!

Я попробовал этот инструмент http://unserialize.net/serialize и мои данные работают так, как и ожидалось: \ мне нужно сделать что-то еще?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2012
$broken_data = 'a:7:{s:4:"zoom";s:2:"18";s:8:"latitude";s:8:"41.37233";s:9:"longitude";s:7:"1.04283";s:11:"address_one";s:16:"Finca Riudabella";s:11:"address_two";s:33:" s/n - 43430 Vimbodí (Tarragona)";s:3:"pin";s:77:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";s:6:"bg_img";s:0:"";}';
$data = serialize(
    array(
        "zoom"      => "18",
        "latitude"  => "41.37233",
        "longitude" => "1.04283",
        "address_one"=>"Finca Riudabella",
        "address_two"=>" s/n - 43430 Vimbodí (Tarragona)",
        "pin"=>"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png",
        "bg_img"=> ""
    )
);
// The right data
var_dump($data);
// Your data.
var_dump($broken_data);
var_dump(unserialize($data));

Как видите, сериализация $data верна.
Сериализованный $broken_data, кажется, имеет неправильную длину строки в «pin».
В $broken_data указано 77 символов (с: 77), но на самом деле длина составляет 67 символов (с: 67)

1 голос
/ 03 апреля 2016

Недавно я столкнулся с точно такой же проблемой и провел бесчисленные часы, пытаясь найти способ восстановить неверные данные.Я прошелся по каждой функции и строке кода в теме Spyropress, пока она не привела меня к странице за страницей функций в WordPress, и, наконец, я понял, что сбой может быть влачентяк возможна:в стремлении выяснить, почему, когда я наткнулся на несколько потоков, подобных этому, это указало на то, что счетчик строк может быть отключен.Оказывается, что поиск / замена были выполнены для данных во всей базе данных, разрушая тонны страниц, созданных с темой.

В моем случае мне пришлось автоматизировать «исправление», и я опубликовалмой код в другой теме.Я не уверен, лучше ли размещать здесь или просто ссылаться там, поэтому я делаю ссылки.Вы можете увидеть мой код для «исправления» сериализованных данных здесь:

Удобный код для автоматического исправления неверных подсчетов в сериализованных данных .

Мое решение работает с большими наборами данных, содержащими HTML / CSS, экранированные двойные кавычки, символы новой строки и множество специальных символов.Я думал, что это может помочь тем, кто находит эту страницу раньше, чем я (как я сделал).

Ура!

0 голосов
/ 26 февраля 2012

Вы назначаете данные дважды.

Первое назначение

$data = 'a:7:{s:4:"zoom";s:2:"18";s:8:"latitude";s:8:"41.37233";s:9:"longitude";s:7:"1.04283";s:11:"address_one";s:16:"Finca Riudabella";s:11:"address_two";s:33:" s/n - 43430 Vimbodí (Tarragona)";s:3:"pin";s:67:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";s:6:"bg_img";s:0:"";}';

Сбой при этом: s:77:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";, но, как вы могли заметить, длина предоставленного URL-адреса составляет 67, когда вы вручную измените его на 67 и используете: var_dump( unserialize( $data)); Вы получите это:

array(7) {
  ["zoom"]=>
  string(2) "18"
  ["latitude"]=>
  string(8) "41.37233"
  ["longitude"]=>
  string(7) "1.04283"
  ["address_one"]=>
  string(16) "Finca Riudabella"
  ["address_two"]=>
  string(33) " s/n - 43430 Vimbodí (Tarragona)"
  ["pin"]=>
  string(67) "http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png"
  ["bg_img"]=>
  string(0) ""
}

Как это изменилось? Я не знаю, кажется, нет специальных символов, возможно, реализация класса Serializable предоставляет неверную длину строки для URL.

Второе назначение

$data = "a:7:{s:4:1}";

Это просто неправильно, объявлять массив из 7 элементов, предоставляя только один ... И этот является строкой, которая должна иметь длину 4 ("str1"), и вместо этого предоставлять только 1 ... Это просто не следует и не может работать.

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