PHP mysql_real_escape_string() - > stripslashes()留下多个斜杠

tea*_*ris 18 php mysql-real-escape-string stripslashes

我有问题使用PHP/MySQL转义/剥离字符串 - 似乎总是有多余的斜杠.


我们以下面的字符串为例:

<span style="text-decoration:underline;">underline</span>
Run Code Online (Sandbox Code Playgroud)


在向数据库添加字符串时,我将其转义mysql_real_escape_string()并将以下内容存储在数据库中(编辑:通过使用mysql app直接查询数据库来检查):

<span style=\\\"text-decoration:underline;\\\">underline</span>
Run Code Online (Sandbox Code Playgroud)


从数据库中读回来时,我正在传递字符串,stripslashes()并返回以下内容:

<span style=\"text-decoration:underline;\">underline</span>
Run Code Online (Sandbox Code Playgroud)


由于引号仍然被转义,它会破坏html并且文本没有加下划线.


  1. 为什么要mysql_real_escape_string()添加三个斜杠,并stripslashes()删除两个斜杠?我希望他们都添加/删除一个斜杠.
  2. 我怎样才能防止这种情况发生?
  3. 我接近这个正确的方法吗?

tj1*_*111 81

最佳方案

在您的php.ini文件中,该magic_quotes_gpc指令设置为on的几率.出于安全原因,应禁用此功能.如果您无法访问php.ini文件(例如,在共享主机上),则可以使用.htaccess指令(假设这是一个apache服务器)来完成相同的操作.

在你的php.ini中

magic_quotes_gpc Off
Run Code Online (Sandbox Code Playgroud)

在.htaccess文件中:

php_flag magic_quotes_gpc Off
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

发生这种情况的原因是由于以下逻辑过程.

  1. 需要转义的字符串将发送到服务器.
    • This is my string. It's awesome.
  2. Magic Quotes在它到达你的代码之前逃脱了撇号.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string现在有两个字符可以逃脱,反斜杠\\以及撇号\'.
    • This is my string. It\\\'s awesome
  4. 这个新的超级转义字符串存储在数据库中.
  5. 从数据库中检索字符串时,它将被传递给stripslashes.这将删除在步骤3中添加的两个转义符,但由于其中一个反斜杠已被转义,因此stripslashes认为它属于.
    • This is my string. It\'s awesome

当您将这些字符串重新提交到数据库时,每次反斜杠的数量都会增加时,这个问题就会失控.

替代方案

一个快速简便的替代方法是magic_quotes在传递字符串之前简单地删除添加的斜杠mysql_real_escape_string.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);
Run Code Online (Sandbox Code Playgroud)

  • "当你将这些字符串重新提交到数据库时,每次反斜杠的数量都会增加时,这个问题就会失控." 是的,这开始发生了! (3认同)
  • 很棒的答案,问题解决了.谢谢你了解三条斜线来自哪里的逻辑,现在有意义. (2认同)
  • 在3年之前和之后帮助**的+1. (2认同)