关于unserialize的问题
本文最后更新于 6255 天前,其中的信息可能已经有所发展或是发生改变。

最近在做土人联盟的时候,发现的关于unserialize函数的一些问题记录一下。
个人Blog的设置信息是serialize一个数组保存在一个字段中的,数组结构为

$message = Array
    (
    'sitename' => "土人'部落",
    'siteisclose' => 1,
    'siteblogdetail' => '0',
    'sitestyle' => 'brown',
    'sitetemplate' => 'default"',
    'siteblognum' => 8,
    'sitedescription' => '用土人的心态去感悟多元化的社会,分享自己独特的理念。',
    'sitetitlekeywords' => '发现生活,感受生活,分享生活,享受生活。',
    'sitemetakeywords' => '土人,土人部落,土人社区,土人景观',
    'sitemetadescription' => '用土人的心态去感悟多元化的社会,分享自己独特的理念。',
    'uid' => 1,
    'nickname' => '土豆男',
    'site' => '',
    'sitetype' => 1,
    'starttime' => 1191074174,
    'lasttime' => 1191629784,
    'totleviews' => 14,
    'totleblogs' => 3
    );

由于程序自动判断了magic_quotes_gpc并将所有POST,GET的数据自动转义(addslashes下),所以上面数组中的$message['sitename']在入库之前就变成了土人\'部落,当进入mysql数据库的保存的时候,保存的内容依然是 土人'部落(不要问我\'怎么入mysql库以后就变成了' 这是mysql的转义特性,绝大多数数据库也都是靠\来转义的),这时候是没有问题的。

当从数据库中查出这个字段,然后unserialize的时候问题就来了,由于从数据库中查出来的是没有转义的 土人'部落 这个值,于是在unserialize的时候就会失败。

想了几种解决方式:
第一,将此数组不再存在一个字段内,每个key独立存在一个字段内,此种被排除,系统已经跑起来了,改起来麻烦的说。
第二,将数据在存入mysql之前对serialize的数组再addslashes下,这时候存入mysql的就是 土人\'部落 了,但是数据库查出来unserialize之后的数据还是 土人\'部落 所以需要再次对此数组逐一stripslashes。
第三,放弃用户体验吧:) ,不允许'/"出现在,有了就自动替换掉

以上方式都是建议在改变原有数据的情况下进行的,而本文的难点就是如何在不改变原有的方式,只是在最后unserialize的时候能够正常unserialize出来数据,最后我也没有找到解决方式,所以来记录下

评论

  1. 17 年前
    2007-10-07 18:25:49

    我选第2个!
    感觉用户体验挺重要的!

  2. TaRot
    17 年前
    2007-10-08 12:51:02

    没看懂就不选了…

  3. TaRot
    17 年前
    2007-10-08 12:51:34

    测试标签

  4. TaRot
    17 年前
    2007-10-08 12:52:26

    测试abbr

  5. TaRot
    17 年前
    2007-10-08 12:53:32

    测试blockquote

  6. 习明
    17 年前
    2007-10-08 12:54:03

    我一般也用第二种 不过如果开始没考虑 要改起来就比较费事了 所以还是尽量把这个过程封装或者独立写成函数 现在说晚了点 ^_^~~

  7. TaRot
    17 年前
    2007-10-08 12:54:03

    测试em

  8. 博主
    17 年前
    2007-10-08 12:55:20

    我凸 TaRot来我这里测试来了

  9. 14 年前
    2010-6-01 16:50:00

    到处都是你这篇文章,呵呵

    不过,貌似网址会错啊~~

    头疼

    如果数组里有网址的话,貌似也无法 unserialize

  10. 洪哥
    13 年前
    2011-10-22 13:42:33

    我也遇到了这个问题,我是ajax返回值进行eval()的时候 碰到,单引号,双引号问题啦【汗】到现在也没解决

  11. 13 年前
    2011-11-14 16:39:10

    真的很需要,那么base64是可以解决这个问题的

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇