【问题标题】:Save to MySQL serialized info with quotes用引号保存到 MySQL 序列化信息
【发布时间】:2012-11-12 18:48:06
【问题描述】:

尝试将序列化的字符串保存到 SQL,但由于引号,我在反序列化时遇到问题。

例如,字符串是“te'st”,序列化后我们有

s:5:"te'st";

但是要将它保存到 SQL 中,我们需要添加斜杠,我正在这样做

serialize(addslashes($string))

在此之后,在我们的 MySQL 数据库中,我们有

s:6:"te'st";

这就是问题所在。 s:6 表示我们有 6 个符号字符串,但我们的 "test'st" 只有 5 个,所以当我们试图反序列化它时,我们得到了错误。

如何解决?试过 htmlspecialcharsmysql_real_escape_string

更新:

我如何使用 mysql_real_escape_string

 mysql_query("INSERT INTO `table`(`string`) VALUES ('" . serialize(array('iId' =>$aSqlResult['typeID'], 'sName' => mysql_real_escape_string($sScanResultLine))) . "')");

【问题讨论】:

    标签: php mysql serialization quotes


    【解决方案1】:

    在您的情况下,mysql_real_escape_string() 是要走的路。它必须工作,除非你做错了(注意:你需要在调用该函数之前连接到 DB)。事实上,您应该使用mysqli_PDO,而不是现在已弃用的mysql_ 扩展名。使用htmlspecialchars() 只是使用了错误的工具来完成任务。

    代码应该是这样的:

    mysql_real_escape_string( serialize( $string ) );
    

    【讨论】:

      【解决方案2】:

      您应该在序列化之后通过转义函数传递数据,而不是之前 - 这就是您现在正在做的事情。

      $serialized = mysql_real_escape_string(serialize($data));
      

      使用带有 PDO 或 MySQLi 的参数化查询,您可以完全忘记转义。

      【讨论】:

        【解决方案3】:

        你犯了一个我见过很多人犯的错误。对转义函数和应该如何使用有一点基本的误解。

        您不能简单地链接转义函数并最终得到适合任何上下文的东西。你的错误很简单..

        你在做两件事:

        1. 序列化对象(本例中为字符串)
        2. 将其保存到数据库中。

        因此,在将其保存到数据库之前,您必须确保您的值已正确转义。用 MYSQLI 做这个! mysql_ 函数已死。

        相当于mysqli::real_escape_string

        但最重要的是..(抱歉拖了这个)..

        serialize 修改输出,它可以返回一大堆东西.. 引号,0x00 的,这在 mysql 查询中是不允许的。

        所以real_escape_string显然必须是最后一步!首先序列化,然后转义该函数的输出。你做的恰恰相反。

        【讨论】:

          猜你喜欢
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-29
          • 2014-10-26
          • 1970-01-01
          • 2017-12-15
          相关资源
          最近更新 更多