加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – unserialize()函数不能对新服务器上的MySQL表中的变量起

发布时间:2020-12-13 17:04:33 所属栏目:PHP教程 来源:网络整理
导读:我们刚刚将网站切换到新服务器.我的 PHP软件中有一部分从MySQL表中提取序列化数据值,并将其放入变量中,然后它应该是unserialize(). 我从来没有在任何其他服务器上出现此问题(这个确切的代码在许多不同的服务器上使用..),但我遇到的问题是值无法反序列化 –
我们刚刚将网站切换到新服务器.我的 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

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

我错过了什么?

解决方法

字符串不相同.查看页面的来源,数据库中出现的内容有一个换行符:

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 Notice: unserialize(): Error at offset 176 of 234 bytes in php shell code on line 1

这意味着发生了一些时髦的事情,不确定是什么.我将继续挖掘,但只是张贴我发现的东西.但是,如果您想要真正的测试,请在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,因为序列化需要准确,它是一个通知错误,大多数人没有显示,为什么没有错误通过.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读