当将带有撇号的单词保存到数据库时,mysql_real_escape_string会添加斜杠'\'

时间:2012-04-29 17:11:49

标签: php mysql mysql-real-escape-string

  

可能重复:
  mysql_real_escape_string and single quote

编辑:我已经检查过,我的托管服务'mysql数据库设置为:

  Language: English (en-utf-8)
   MySQL charset: UTF-8 Unicode (utf8)

下面的'userItem'变量来自表单上用户输入的文本字符串。

当我输入“这是A的用户项目”时 - 我在其上使用 mysql_real_escape_string - 这是保存到数据库的内容:

       "this is A\'s user item"

BAD。使用我的测试字符串保存了一个backslsh。

如果我注释掉 mysql_real_escape_string($ userItem)并在查询字符串中使用 $ userItem - 这就是存储在数据库中的内容:

       "this is A's user item"

GOOD !!没有反斜杠。

但让我们面对现实,出于安全原因,我真的想使用 mysql_real_escape_string - 我一直认为在保存之前在字符串上使用mysql_real_escape_string更安全他们到数据库。

问题:当我检索我的文本字符串“这是A的用户项”并在浏览器中显示它时 - 它在字符串中有斜杠。并且它让用户感到惊讶 - 他们没有输入“这是用户项目”,他们输入了 “这是A的用户项”

以下是代码:

 $newItemInsertQuery = "INSERT INTO " . Dbases::$USERITEMS_TABLE 
   . " VALUES "
   . "('" 
   . mysql_real_escape_string( $loggedInUser ) . "', '" 
  //. mysql_real_escape_string($userItem) . "', '" COMMENTED OUT due to extraneous backslash
   . $userItem . "', '"
   . mysql_real_escape_string($description) . "', '" 
   . mysql_real_escape_string($itemImage) . "', '"
   . mysql_real_escape_string($userSubfolder) .  "')";

   $result = mysql_query($newItemInsertQuery);

我怀疑以下内容;

  • 我希望在数据库插入之前对字符串使用mysql_real_escape_string是一件好事。

  • 但我不知道必须采取的其他措施

3 个答案:

答案 0 :(得分:2)

高度建议通过mysqliPDO使用参数化查询(两者都内置于PHP)。

mysql_real_escape_string()充其量是权宜之计。使用参数化查询既不那么麻烦(避免这样的问题),也更安全 - 加上很多东西它也可以更有效。

它还可以更准确地说明传入和传入数据库的数据,因为它不需要执行任何类型的转义。

答案 1 :(得分:0)

  

在将字符串保存到数据库之前对字符串使用mysql_real_escape_string更安全。

它不是“更安全” 实际上这是一个严格规则

但是你的问题不是来自这个功能,而是来自破坏你的数据的其他一些代码或设置。

所以,我们这里有两个问题。

  1. 如何说服你不要责怪这个功能。
  2. 如何找到真正的原因。
  3. 对于第一个,请回显最终查询

    echo $newItemInsertQuery;
    

    并在此处发布您的内容

    感谢您发帖 现在让我们看看 由于语法错误,您发布的查询将永远不会被执行。

    INSERT INTO useritems VALUES('b@b.com','b' s第4项','第4项','','')

    请参阅强调部分:此处您的字符串文字已关闭,未遵循正确的语法关键字。

    使用此

    更改您的查询调用
    $result = mysql_query($newItemInsertQuery) or trigger_error(mysql_error()." ".$query);
    exit;
    

    并查看

答案 2 :(得分:0)

我相信我已经找到了额外反斜杠的来源,也是一个解决方案。我会在这里发布,然后回来发布我目前正在处理的解决方案。

提交表单的 input type =“text”字段,然后在PHP的服务器端从$ _POST数组中提取带有撇号的文本字符串并通过方式显示一个 echo 斜杠 ALREADY IN THE TEXT STRING ,如下所示:

“这就是它的样子”

我无法在我的网站目录中使用我的.htaccess文件来使用该行关闭'魔术引号'

php_flag magic_quotes_gpc关闭

因为1and1托管服务器显示错误(请参阅我对此的评论)并且不会运行我的网站。

我有一个解决方案,一旦证明我会发回。

我已经测试了以下代码并且它可以工作 - 在我的表单上,我输入字符串“b的第6项”,并且在提交表单时,此代码处理表单的POST:

 $itemName = $_POST['theItemname'];
 echo $itemName; 
 if (get_magic_quotes_gpc())
 {
    $stripped = stripslashes($itemName);
    echo "<br /> This is itemName string after stripping: " . $stripped;
 }

输出结果为:

     b\'s 6th item
     This is itemName string after stripping: b's 6th item

我已阅读下面的评论,并会查看所有选项。现在,我现在需要一个解决方案,上面避免调用stripslashes()除非'魔术引号'打开 - 它的工作原理。

我会准备好回复并尝试找到更优雅的方式!谢谢大家。