- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们刚刚将网站切换到新服务器。我的 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";
正如您在 Great 之后看到的那样。但是,它应该可以很好地处理换行符。当我复制数据库序列化字符串并尝试反序列化它时,我收到了:
PHP Notice: unserialize(): Error at offset 176 of 234 bytes in php shell code on line 1
这意味着发生了一些奇怪的事情,不确定是什么。我将继续挖掘,但只是发布我发现的内容。但是,如果您想要真正的测试,请在 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;
?>
抱歉,我将换行符更改为换行符,因为我在 CLI 中对其进行了测试。上面的代码删除了 after Great 的额外空格,并且工作正常。
所以发生的事情基本上是额外的空间打乱了计数,正如您所看到的 s:XX 数字表示字符串的长度,额外的空间使它成为 32 而不是“Great Price”声明的 31 ,因为序列化需要准确,它抛出了一个通知错误,大多数人都没有显示这个错误,这也是为什么没有错误出现的原因。
关于php - unserialize() 函数不适用于新服务器上 MySQL 表中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3688442/
这个问题在这里已经有了答案: How to repair a serialized string which has been corrupted by an incorrect byte count
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
有什么方法可以限制 PHP 的 unserialize() 只解析数组吗?出于安全原因。假设在我不想调用的反序列化对象中有一个邪恶的 __unserialize() 魔术方法! 最佳答案 Is the
我的数据库中有一个“招聘人员”表,它具有不同的属性,其中之一是“专业”。 "Professions" 是一个序列化数组,我从多选表单中获得它。这很好用。 当我反序列化这个属性时,没有打印任何东西——没
我使用函数 serialize() 插入数据库值(数组) , 如何用 unserialize() 回显它们在标签 ... ? 我在数据库中有这个:a:6:{i:0;s:15:"Coffee";i:1;
php中有格式化字符串并转换成数组或对象的好方法,即序列化处理。 有两种序列化变量的方法。 以下示例,使用 serialize() 和 unserialize() 函数:
我选择了具有多个属性的标签,我使用 PHP serialize 函数作为序列化数组将多个值保存在数据库中: 我插入的数据库数组: a:9:{i:0;s:8:"Arkansas";i:1;s:10:"C
我们刚刚将网站切换到新服务器。我的 PHP 软件有一部分从 MySQL 表中提取一个序列化的数据值,并将其放入一个变量中,然后它应该是 unserialize()。 我从来没有在任何其他服务器上遇到过
我有一个分类广告网站,用户可以在其中买卖任何东西... 我的问题是公司需要花费大量金钱、时间等,所有分类广告在发布到网站之前必须由自然人(员工)审核。 因此,当您创建新的分类实体时,您会收到类似“您的
这里,当我点击提交按钮进行连接时出现此错误。 注意:unserialize():在/var/www/Blog/Symfony/vendor/doctrine/dbal/lib/Doctrine/DBA
如何从该数组中获取 $userid 和 $username 的所有值 a:1:{s:2:"cc";a:2:{i:4;s:4:"koko";i:8;s:4:"soso";}} 我的代码只打印最后一个字符
我尝试使用内存缓存在 PHP 中缓存我的用户对象,但在使用 PDO 时出现错误。我添加了一个 __sleep 和一个 __wakeup 函数。 用户.php /** * @var PDO */ p
我有一个保存到文件的序列化值数组,需要更改其中一个变量的值。在示例中,我更改了 $two 的值,然后使用新值将整个数组保存回文件中。 是否有一种更有效的方法可以仅更改单个值而无需读取和写入整个文件/数
我的问题很基础。 关于 serialize() 和 unserialize() 在 php 中的确切含义,我没有找到任何示例来满足我的需求?他们只是举了一个例子——序列化一个数组并以无法解释的格式显示
我的 Drupal 站点页面上方出现此错误: Notice: unserialize() [function.unserialize]: Error at offset 0 of 32 bytes i
我正在测试来自 build internet 的代码,这是一个 OOP 教程。我收到一条错误消息: unserialize() expects parameter 1 to be string, ob
我正在处理来自 MySQL 数据库的一些序列化数据,我需要使用 Ruby 对其进行反序列化(序列化数据用于为数据库查询构建 WHERE 子句)。 PHP 有 unserialize() 方法可以将它转
我正在与本地计算机上的工作人员一起使用SOCK集群运行并行操作。如果我限制要迭代的集合(在一个测试中使用70个任务而不是完整的135个任务),那么一切都很好。如果我购买全套产品,则会收到错误消息“un
我正在使用 symfony 2,我有一个包含数组的实体,在 MySQL 数据库中,数组列生成为 longtext utf8_unicode_ci 列,并带有注释 DC2Type:array. 在查询数
我试图获取通过 POST 提供的日期,然后生成从提供的开始日期起 12 周内的日期列表。然后,这些日期将进入数据库,并输出 12 周的计划,用户可以与之交互(添加/编辑/删除)。 我成功获取开始日期,
我是一名优秀的程序员,十分优秀!