Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的非序列化问题_Php_Serialization - Fatal编程技术网

php中的非序列化问题

php中的非序列化问题,php,serialization,Php,Serialization,我在PHP5.2中使用序列化/非序列化函数。要存储的文本通过表单发布。顺便说一句,前后没有空格。如果文本包含“或”,它将成功序列化。问题是它没有取消序列化。我做错了什么?序列化时,应该使用,取消序列化时,使用函数 示例: if (get_magic_quotes_gpc()) { serialize($variable); } else { addslashes(serialize($variable)); } if (get_magic_quotes_gpc()) { strip

我在PHP5.2中使用序列化/非序列化函数。要存储的文本通过表单发布。顺便说一句,前后没有空格。如果文本包含“或”,它将成功序列化。问题是它没有取消序列化。我做错了什么?

序列化时,应该使用,取消序列化时,使用函数

示例:

if (get_magic_quotes_gpc())
{
  serialize($variable);
}
else
{
  addslashes(serialize($variable));
}

if (get_magic_quotes_gpc())
{
  stripslashes(unserialize($variable));
}
else
{
  unserialize($variable);
}

这可能是对这种行为的回应。 因此,要取消序列化,可能必须先执行stripslashes()操作:

虽然在5.2系统上几乎不可能使用magic_引号…
要说清楚,您必须找到初始数据和返回数据之间的差异


但无论如何,为什么不使用会话而不是将数据发送到浏览器并返回呢?会话确实是一种更快、更安全的方式。

在引号中添加斜杠可以解决问题。请查看我的代码:
David Walsh有一个简单的解决方案:

//to safely serialize  
$encoded_serialized_string = base64_encode(serialize($your_array));  

//to unserialize  
$array_restored = unserialize(base64_decode($encoded_serialized_string));  

你为什么要这样做?为什么不使用会话之类的方式?-通过POST发送和接收数据意味着用户可以更改它,并且必须来回传输更多数据。所有数据都以序列化格式存储在文件中。会话不会剪切它。让我直说吧。你从POST表单接收一些数据,然后序列化$\u POST数组并将结果字符串写入一个文件?然后读回,数据不会取消序列化。对吗?如果数据包含“或”,是的。你能打印($\U POST)以显示实际收到的内容吗???@Kurt:你可能已经打开了魔引号,请参阅我更新的答案。如果有错误,你会得到什么?看,@Web。为什么不在发布代码之前运行它?OP告诉你它根本没有连载。没错。如果您没有足够的经验来编写代码,只需在发布之前运行它,看看它是否有作用。很抱歉,我忘了告诉您要序列化的文本是数组关联的。(可能)由于此STRIPSLASHES函数不起作用。所有数据都以序列化格式存储在文件中。SESSIONS不能解决这个问题。很抱歉@Kurt,但是stripslashes与数组无关。它与字符串一起工作。它总是有效的。无论如何,magic quotes只是一种猜测,为了告诉你一些确定的事情,你必须找出初始数据和返回数据之间的差异。或者至少带上两条线here@Kurt如果返回的数据相同,则序列化将起作用。时期你必须看得更好。很可能是因为魔术引语,如果你承认它在播放的话。至少你必须意识到没有人能帮你完成工作。试着做一些明智的事情,而不是重复同样的“不起作用”的错误评论。在形成数组之前,我对变量进行了转义,因此添加斜杠是有效的。应转义序列化的字符串。倒过来不行!但是我想知道它是否会在以后的PHP版本上修复,以及这个问题的根源是什么。这不是PHP的错误。正如后面的答案所建议的,您应该使用addslashes来确保您的报价被转义。David Walsh的解决方案之所以有效,是因为它将所有内容转换为不包含引号的base64字符串。当我在一个没有启用魔法引号的系统上开发并部署到一个启用魔法引号的服务器上时,需要将stdClass对象持久化为平面文件时,我个人使用过这种方法。
//to safely serialize  
$encoded_serialized_string = base64_encode(serialize($your_array));  

//to unserialize  
$array_restored = unserialize(base64_decode($encoded_serialized_string));