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
涉及字符串序列化,魔术引号等的设置都相同。
我在想什么???
字符串不相同。查看页面的源代码,从数据库中出来的页面有一个换行符:
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”声明,因为序列化需要准确,它抛出了一个通知错误,大多数人不会显示该错误以及为什么没有出现错误。
归档时间: |
|
查看次数: |
9612 次 |
最近记录: |