MyM*_*ial 5 php mysql quotes serialization
试图将序列化的字符串保存到SQL,但后来我因为引号而无法将其反序列化.
例如,字符串是"te'st",序列化后我们有
s:5:"te'st";
Run Code Online (Sandbox Code Playgroud)
但要将其保存到SQL,我们需要添加斜杠,而我正在做
serialize(addslashes($string))
Run Code Online (Sandbox Code Playgroud)
在此之后,在我们的MySQL数据库中我们有
s:6:"te'st";
Run Code Online (Sandbox Code Playgroud)
这就是问题所在.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))) . "')");
Run Code Online (Sandbox Code Playgroud)
您应该在序列化之后通过escape函数传递数据,而不是之前 - 这就是您现在正在做的事情.
$serialized = mysql_real_escape_string(serialize($data));
Run Code Online (Sandbox Code Playgroud)
使用PDO或MySQLi的参数化查询,您可以完全忘记转义.
你犯了很多我犯过的错误.对如何逃避功能和应该使用的一些基本误解.
你不能简单地链接转义函数,最终得到适合任何上下文的东西.你的错误很简单..
你做了两件事:
因此,在将其保存到数据库之前,必须确保正确转义了您的值.用MYSQLI做这个!mysql_函数已经死了.
等价的是mysqli :: real_escape_string.
但最重要的是..(抱歉拖延此功能)..
serialize修改输出,它可以返回一大堆东西..引号,0x00这是在mysql查询中不允许的.
所以real_escape_string显然必须是最后一步!首先序列化,并转义该函数的输出.你完全相反.