尝试将序列化字符串保存到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))) . "')");
答案 0 :(得分:6)
你应该在序列化之后通过转义函数传递数据,而不是之前的 - 这就是你现在正在做的事情。
$serialized = mysql_real_escape_string(serialize($data));
对PDO或MySQLi使用参数化查询,您可以完全忘记转义。
答案 1 :(得分:6)
你犯了一个错误我见过很多人。对逃避功能和应该如何使用的一些基本误解。
你不能简单地链接转义函数,最终得到适合任何上下文的东西。你的错误很简单..
你正在做两件事:
因此,在将其保存到数据库之前,必须确保正确转义了您的值。用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 ) );