unserialize()函数不适用于新服务器上MySQL表中的变量

jef*_*kee 5 php mysql apache string serialization

我们刚刚将网站切换到了新服务器。我的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';}
?>
Run Code Online (Sandbox Code Playgroud)

我还检查了有关serialize()和unserialize()函数的服务器设置...

检查这两个设置:http : //www.paulmasoumi.com/admin/phpinfo.php http://demo.brixwork.com/admin/phpinfo.php

涉及字符串序列化,魔术引号等的设置都相同。

我在想什么???

Jim*_* W. 4

字符串不相同。查看页面的源代码,从数据库中出来的页面有一个换行符:

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";
Run Code Online (Sandbox Code Playgroud)

正如你在《伟大》之后所看到的。但是,它应该可以很好地处理新行字符。当我复制数据库序列化字符串并尝试对其进行反序列化时,我收到了一条:

PHP 注意:unserialize():第 1 行 php shell 代码中 234 字节的偏移量 176 处出错

这意味着一些奇怪的事情正在发生,但不确定是什么。我将继续挖掘,但只是发布我发现的内容。但是,如果您想要进行真正的测试,请在 Great 之后添加换行符。

更新

<?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;

?>
Run Code Online (Sandbox Code Playgroud)

抱歉,我将换行符更改为换行符,因为我在 CLI 中对其进行了测试。上面的代码在 Great删除后有多余的空间,并且工作得很好。

所以发生的事情基本上是额外的空间导致了计数,正如你可以看到 s:XX 数字表示字符串有多长,额外的空间使它成为 32 而不是 31 对于“Great Price”声明,因为序列化需要准确,它抛出了一个通知错误,大多数人不会显示该错误以及为什么没有出现错误。