PHP 序列化/反序列化错误,为什么反序列化会失败?

问题描述 投票:0回答:3

我们在使用 PHP 序列化/反序列化时遇到了一个奇怪的问题。我们已经序列化并存储在 mysql 中的特定字符串中(UTF-8 排序规则)。反序列化时会返回错误。

例如:

输入字符串:

“Anoop 出色地从杂志上剪下了照片 以字母 P 开头。“

数据库中的序列化数据:

s:96:“Anoop 从杂志上剪下图片做得很好 以字母 P 开头。”;

反序列化时,我们收到此错误:

注意 - unserialize ():在 101 字节的偏移 2 处出错。

我们注意到字符串长度不同。造成这个问题的原因是什么?

php mysql serialization utf-8
3个回答
3
投票

您的连接中可能没有使用 utf-8 或者您的 PHP 上下文不是 utf-8?

尝试使用SQL:

SET CLIENT_ENCODING = utf8 

在您获取数据之前。

尝试/验证:

ini_set ('default_charset' , 'UTF-8' );
setlocale (LC_ALL, 'de_DE.UTF-8'); # or what your favorit

1
投票

你看到第二个字符串中有一个分号了吗? UTF-8并不总是使用1个字节,它是1到4个字节。

从数据库中解码字符串时,请确保输入到数据库时使用正确的字符集进行编码。

我正在使用一个表单在数据库中创建记录,该记录的内容字段是有效的 JSON,但其中包含大撇号。如果带有表单的页面没有

在头部,然后数据以错误的编码发送到数据库。然后,当 json_decode 尝试将字符串转换为对象时,每次都失败。


1
投票

PHP 序列化/反序列化没有问题,

就是这样做

$string = "Anoop did a great job cutting out pictures from the magazine that started with the letter P. ";
echo $string = serialize($string);
echo '<br>';
echo unserialize($string);

那就没有错误了。

如果您直接输入

unserialize
字符串,则会显示与之前显示的相同的错误。

$string = "Anoop did a great job cutting out pictures from the magazine that started with the letter P. ";
//echo $string = serialize($string);
echo '<br>';
echo unserialize($string);

这对我有用,你会尝试这个。

© www.soinside.com 2019 - 2024. All rights reserved.