使用引号保存到MySQL序列化信息

时间:2012-11-24 20:47:08

标签: php mysql serialization quotes

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

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

s:5:"te'st";

但要将其保存到SQL,我们需要添加斜杠,而我正在做

serialize(addslashes($string))

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

s:6:"te'st";

这就是问题所在。 s:6表示我们有6个符号字符串,但我们的“te'st”只有5,所以当我们尝试反序列化时,我们会收到错误。

如何解决?尝试 htmlspecialchars mysql_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))) . "')");

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:6)

你犯了一个错误我见过很多人。对逃避功能和应该如何使用的一些基本误解。

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

你正在做两件事:

  1. 序列化对象(本例中为字符串)
  2. 将其保存到数据库中。
  3. 因此,在将其保存到数据库之前,必须确保正确转义了您的值。用MYSQLI做这个! mysql_函数已经死了。

    等效于mysqli::real_escape_string

    但最重要的是......(对不起拖延此事)..

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

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

答案 2 :(得分:3)

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

代码应该是这样的:

mysql_real_escape_string( serialize( $string ) );