ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルで false を返すアンシリアライズの解決策

php_PHP チュートリアルで false を返すアンシリアライズの解決策

WBOY
WBOYオリジナル
2016-07-13 10:18:37892ブラウズ

phpでfalseを返すアンシリアライズの解決策

phpは、serialize(シリアル化)メソッドとunserialize(デシリアライズ)メソッドを提供します。

serialize を使用してシリアル化した後、unserialize を使用してデシリアライズして元のデータを取得します。

まず次のプログラム例を見てみましょう:

1

2

3

4

5

6

7

8

9

10

11

12

13

$arr = 配列(

'名前' => 'fdipzone'、

「性別」=>「男性」

);

$str = Serialize($arr) //シリアル化

echo 'str:'.$str."rnrn" をシリアル化します

$content = unserialize($str); // 逆シリアル化

echo "str:rn のシリアル化を解除";

var_dump($content);

?>

出力:

1 str:a:2:{s:4:"名前";s:8:"fdipzone";s:6:"性別";s:4:"男性";} をシリアル化します ただし、次の例では、逆シリアル化は false を返します
2

3

4

5

6

7

8

9

文字列のシリアル化を解除します:

配列(2) {

["名前"]=>

文字列(8) "fdipzone"

["性別"]=>

文字列(4)「男性」

}

12$str = 'a:9:{s:4:"時刻";i:1405306402;s:4:"名前";s:6:"新陳";s:5:"url";s:1 : "-";s:4:"単語";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s : 5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"北京、中国都市モバイル";s:4:"ミャオ";s:1:"5";}';
3

4

var_dump(unserialize($str)) // bool(false)

?>

シリアル化された文字列を確認し、問題が 2 か所にあることを確認します:

s:5:"URL"
s:29:"http://www.baidu.com/test.html"
この 2 つの場所は
であるべきです s:3:"URL"
s:30:"http://www.baidu.com/test.html"

この問題の原因は、データをシリアル化するときのエンコーディングがデシリアル化するときのエンコーディングと矛盾していることです。たとえば、データベースが latin1 であり、UTF-8 の文字長が異なることが原因です。
他に考えられる問題には、一重引用符、二重引用符、ASCII 文字などがあります。 r には長さの計算にも問題があります。

解決策は次のとおりです:

例:
1

2

3

4

5

6

7

8

9

10

11

12

13

//utf8

関数 mb_unserialize($serial_str) {

$serial_str= preg_replace('!s:(d+):"(.*?)";!se', "'s:'.strlen('$2').':"$2";'", $serial_str );

$serial_str= str_replace("r", "", $serial_str);

unserialize($serial_str) を返す

}

//アスキー

関数 asc_unserialize($serial_str) {

$serial_str = preg_replace('!s:(d+):"(.*?)";!se', '"s:".strlen("$2").":"$2";"', $serial_str );

$serial_str= str_replace("r", "", $serial_str);

unserialize($serial_str) を返す

}

12
3

4

5

6

7

8

9

10

11

12

13

14

echo '';

//utf8

関数 mb_unserialize($serial_str) {

$serial_str= preg_replace('!s:(d+):"(.*?)";!se', "'s:'.strlen('$2').':"$2";'", $serial_str );

$serial_str= str_replace("r", "", $serial_str);

unserialize($serial_str) を返す

}

$str = 'a:9:{s:4:"時刻";i:1405306402;s:4:"名前";s:6:"新陳";s:5:"url";s:1 : "-";s:4:"単語";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s : 5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"北京、中国都市モバイル";s:4:"ミャオ";s:1:"5";}';

var_dump(unserialize($str)); // false

var_dump(mb_unserialize($str)); // 正解です

正常に逆シリアル化するには、一重引用符と二重引用符を処理し、r をフィルター処理した mb_unserialize メソッドを使用します。

アンシリアライズを使用します:

ブール(偽)

mb_unserialize を使用します

http://www.bkjia.com/PHPjc/882699.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

配列(9) {

["時間"]=>

int(1405306402)

["名前"]=>

文字列(6)「新陳」

["url"]=>

文字列(1) "-"

["単語"]=>

文字列(1) "-"

["rpage"]=>

文字列(30) "http://www.baidu.com/test.html"

["cpage"]=>

文字列(1) "-"

["ip"]=>

文字列(15) "117.151.180.150"

["ip_city"]=>

string(31) "北京、中国 北京モバイル"

["ミャオ"]=>

文字列(1)「5」

}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/882699.html

技術記事 PHP で false を返すアンシリアル化の解決策 PHP には、serialize (シリアル化) メソッドと unserialize (逆シリアル化) メソッドが用意されています。 Serialize を使用してシリアル化した後、unserialize を使用して逆シリアル化できます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。