Функция unserialize () не работает с переменной из таблицы MySQL на новом сервере - PullRequest
5 голосов
/ 11 сентября 2010

Мы только что переключили наш сайт на новый сервер.Есть часть моего программного обеспечения PHP, которая извлекает сериализованное значение данных из таблицы MySQL и помещает его в переменную, а затем она должна быть unserialize ().серверы (и этот точный код используется на многих разных серверах ..), но у меня возникает проблема, когда значение не удается десериализовать - оно возвращает false (пусто).

ОДНАКО, если я копирую точное значение, помещаю его в другой $ var, а затем десериализую ($ var), оно отлично работает в массиве ... это те же самые значения.Один работает, другой нет.

Проверьте следующую ссылку, чтобы увидеть, что я имею в виду ..

http://paulmasoumi.com/admin/test.php

И код PHP на этой странице:

<?
include 'start.php';

$var = 'a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";}';


echo 'Echoing $var:<br />';
echo $var;
echo '<br />';


echo 'Echoing $settings[\'remarksdisplay\'] retrieved from mysql database field:<br />';
echo $settings['remarksdisplay'];
echo '<br />';

echo '<br />';

echo 'When you run print_r(unserialize($var)):<br />';
print_r(unserialize($var));
echo '<br />';

echo 'When you run print_r(unserialize($settings[\'remarksdisplay\'])):<br />';
print_r(unserialize($settings['remarksdisplay']));

echo '<br />';
echo '<br />';

echo 'When you run IF statement to see if $settings[\'remarksdisplay\']==$var:<br />';
if($settings['remarksdisplay']==$var) {echo "EQUAL";} else {echo 'not equal';}
?>

Я также проверил настройки сервера в отношении функций serialize () и unserialize () ...

Проверьте эти две настройки: http://www.paulmasoumi.com/admin/phpinfo.php http://demo.brixwork.com/admin/phpinfo.php

Настройки, включающие сериализацию строк, магические кавычки и т. Д., Идентичны.

Что мне не хватает ???

Ответы [ 3 ]

4 голосов
/ 11 сентября 2010

Строки не идентичны.При просмотре источника вашей страницы у выходящей из базы данных появляется разрыв строки:

a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great 
Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";

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

Примечание PHP: unserialize (): ошибка по смещению 176 из 234 байтов в коде оболочки php в строке 1

Что означает, что происходит что-то странное, не знаю, что.Я собираюсь продолжать копать, но просто размещать то, что я узнал.Однако, если вы хотите истинный тест, добавьте новую строку после Великого.

ОБНОВЛЕНИЕ

<?php
$var = 'a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great' . "\n" .  
'Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";}';

$settings['remarksdisplay'] = 'a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great
Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";}';

echo 'Echoing $var:' . PHP_EOL;
echo $var;
echo "\n\n";


echo 'Echoing $settings[\'remarksdisplay\'] retrieved from mysql database field:' . PHP_EOL;
echo $settings['remarksdisplay'];

echo "\n\n";

echo 'When you run print_r(unserialize($var)):' . PHP_EOL;
print_r(unserialize($var));
echo "\n";

echo 'When you run print_r(unserialize($settings[\'remarksdisplay\'])):' . PHP_EOL;
print_r(unserialize($settings['remarksdisplay']));

echo "\n\n";

echo 'When you run IF statement to see if $settings[\'remarksdisplay\']==$var:' . PHP_EOL;
if($settings['remarksdisplay']==$var) {echo "EQUAL";} else {echo 'not equal';}
echo PHP_EOL;

?>

Извините, я изменил перевод строки на символы NewLine, потому что я проверял егов CLI.Приведенный выше код имеет дополнительный пробел после удаления Great , и он работает просто отлично.

Итак, в основном происходило то, что лишнее пространство сбрасывало счетчик, как вы можете видеть, s: XX число указывает, какова длина строки, что дополнительное пространство сделало его 32 вместо 31 для «Великого».Ценовое предложение, так как сериализация должна быть точной, это выдает ошибку Уведомления, которую большинство людей не показывают и почему не было никаких ошибок.

0 голосов
/ 02 марта 2014

Используйте substr для удаления кавычек, таких как

$str = substr( $data['str'], 1, -1 );

и затем десериализуйте ваши данные.

причина в том, что MySQL возвращает строку в кавычках

0 голосов
/ 11 сентября 2010

Просто угадайте, может быть, база данных возвращает какой-то объект, который не очень хорошо работает с несериализацией? Попробуйте:

$str = (string) $settings['remarksdisplay'];
print_r(unserialize($str));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...