mysql_real_escape_string和单引号

时间:2009-07-29 15:08:04

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

我很沮丧。我希望能够用单引号插入我的数据库名称 - 例如,O'Connor。

因此,当插入数据库时​​,我会这样做:

 $lname = mysql_real_escape_string($_POST['lname']);

然后我将$ lname插入数据库。

当它在数据库中时,它显示为O \'Connor。

所以,如果我在网络应用程序中回忆起姓氏,我将不得不使用:

 $lname = stripslashes($r["lname"]);

这一切似乎都很好。但是,我有一个搜索功能,它将搜索姓氏并显示结果。当我搜索时,我必须搜索O \'Connor以获得任何结果。

你看,在我搜索之后,文本框会自动存储刚搜索过的内容的值(使用会话)。所以我的代码就是这样:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

就像我之前说过的,当我搜索时,我必须使用“O \'Connor”,然后在搜索之后,文本框中的值变为“O \\\\'Connor”

试图解决这个问题令人沮丧。有谁知道我做错了什么?谢谢!

编辑:

这是我的php5.ini文件,关于魔术引号:

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

但是,我的网站托管在GoDaddy上,我无权编辑该文件:(

6 个答案:

答案 0 :(得分:7)

听起来PHP配置中启用了Magic Quotes

检查它是否实际启用:

echo get_magic_quotes_gpc();

To disable,编辑你的php.ini文件:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

或者将此行添加到.htaccess:

php_flag magic_quotes_gpc Off

答案 1 :(得分:1)

启用魔术引号。这意味着放置在post或get或其他类似位置的任何内容都会自动转义,以便初学程序员不必担心它。如果我没记错的话,它在当前版本的PHP中已被弃用。

您要做的是如何处理此问题,并让脚本从任何配置运行相同的内容如下:

function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    return mysql_real_escape_string($value);
}

你可能想进一步修改它以将非数字数据包装在引号中,这是一种常见的变体,但我发现最好手动放置这些引号。

答案 2 :(得分:1)

很少编辑fixinput函数来检查你的PHP安装是否确实有真正的转义字符串(旧版本没有):

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }

答案 3 :(得分:0)

  

当它在数据库中时,它显示为O \'Connor。

     

所以,如果我在网络应用程序中回忆起姓氏,我将不得不使用:

 $lname = stripslashes($r["lname"]);

错误!使用mysql_real_escape_string转义字符串时,它们仅在查询中转义。数据库解释查询,因此数据最终在数据库中,没有任何转义字符。从数据库中提取数据时,必须使用stripslashes。如果您认为这样做,则意味着数据库中的数据被破坏。很可能是因为你打开了魔法引号。

你应该:

  • 关闭魔术引号或全局反转其效果。有关详细信息,请参阅the manual
  • 使用bound parameters(最佳解决方案)使用mysql_real_escape_string转义所有变量。您应该在构建查询的位置执行此操作。
  • 对从数据库中提取的内容不做任何处理。

特别是,不要将函数设置为fixinput以及此处某些答案中列出的变体。这是解决问题的错误方法,因为它会弄乱任何不是来自http请求的数据。

答案 4 :(得分:-1)

我不检查get_magic_quotes_gpc是否开启。

我只是做$lname = mysql_real_escape_string(stripslashes($_POST['lname']));所以如果没有任何引用的文字,它就不会剥去斜线..如果有引用它会将它们剥离。

它为我带来奇迹!

答案 5 :(得分:-2)

您需要做的就是使用搜索查询mysql_real_escape_string,它应该是完全没问题的。这样做的最好方法是永远不要存储转义,而只是逃避它,一切都进入数据库。

相反,这样做:

 $_SESSION['search'] = $_GET['search'];
 $search = mysql_real_escape_string($_GET['search']);