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

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,所以当我们尝试反序列化时,我们会收到错误.

怎么解决?尝试了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))) . "')");
Run Code Online (Sandbox Code Playgroud)

MrC*_*ode 6

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

$serialized = mysql_real_escape_string(serialize($data));
Run Code Online (Sandbox Code Playgroud)

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


Eve*_*ert 6

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

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

你做了两件事:

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

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

等价的是mysqli :: real_escape_string.

但最重要的是..(抱歉拖延此功能)..

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

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