【问题标题】:PHP: POST data + apostrophesPHP:POST数据+撇号
【发布时间】:2009-10-03 18:09:30
【问题描述】:

想象一下:

  • 表单数据包含撇号
  • 表单被提交
  • POST 数据被序列化
  • POST 数据写入数据库
  • 已检索数据库数据
  • 数据无法反序列化

问题出在序列化数据中。我试过不带撇号和带撇号:

  • s:7:"company";s:12:"Joes company"
  • s:7:"company";s:14:"Joe 的公司"

我知道 POST 数据在引号和撇号中添加了斜杠,但是在某处我的斜杠被删除了,这破坏了序列化。我没有在任何地方使用 stripslashes() 函数 - 有什么想法吗?

【问题讨论】:

  • 您可能可以通过查看您列出的每个阶段的输出来弄清楚这一点。

标签: php serialization quotes apostrophe


【解决方案1】:

您确定要添加斜线吗?仅当启用魔术引号时才会发生这种情况。

【讨论】:

  • Magic Quotes 已启用,并添加了斜线。我已经缩小到以下内容:在我的 SQL 查询中,我用撇号包围了这些值。尝试以下操作,您将看到 " $test = '"company";s:14:"Joe\'s company"'; echo $test; " 返回不带斜杠的字符串。这就是为什么斜杠在数据库中一次不存在的原因。但是由于序列化的字符串有引号和撇号,我如何在不使用任何一个的情况下插入数据库?!
  • 我找到了解决方案。即使 Magic Quotes 在 POST 数据中添加了斜线,您也必须对序列化字符串执行进一步的addslashes(),以便可以将其添加到数据库中,并用引号或撇号关闭。一旦从数据库中检索到值并取消序列化,就可以使用 stripslashes()。
  • 作为第一个问题的答案:使用准备好的语句,查看 mysqli 或 pdo。
【解决方案2】:

如果您正在将序列化数据写入数据库并且不使用任何关系或高级数据库功能,您可以在插入数据库之前简单地对序列化数据进行 base64 编码,并在读回时解码。

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多