php – unserialize()函数不能对新服务器上的MySQL表中的变量起
我们刚刚将网站切换到新服务器.我的
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()函数的服务器设置…… 看看这两个设置: 涉及字符串序列化,魔术引号等的设置都是相同的. 我错过了什么? 解决方法
字符串不相同.查看页面的来源,数据库中出现的内容有一个换行符:
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"; 正如你所看到的那样伟大.但是,它应该处理新的行字符就好了.当我复制数据库序列化字符串并尝试反序列化时,我收到了:
这意味着发生了一些时髦的事情,不确定是什么.我将继续挖掘,但只是张贴我发现的东西.但是,如果您想要真正的测试,请在Great之后添加换行符. UPDATE <?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 "nn"; echo 'Echoing $settings['remarksdisplay'] retrieved from mysql database field:' . PHP_EOL; echo $settings['remarksdisplay']; echo "nn"; 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 "nn"; 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; ?> 抱歉,我将Linebreaks更改为NewLine字符,因为我在CLI中对其进行了测试.上面的代码在Great删除后有额外的空间,它工作得很好. 所以发生的事情基本上就是额外的空间从计数中消失了,因为你可以看到s:XX数字表示字符串有多长,额外的空格使得32为“Great Price”语句而不是31,因为序列化需要准确,它是一个通知错误,大多数人没有显示,为什么没有错误通过. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |