mysql_real_escape_string和单引号(mysql_real_escape_str

2019-06-27 03:46发布

我很沮丧。 我希望能够插入到用单引号我的数据库的名称 - 例如,奥康纳。

因此,插入数据库时​​,我做的:

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

然后我插入$ LNAME到数据库。

当它在数据库中,它显示为O \'康纳。

所以,如果我在我的web应用程序回顾过去的名字,我将不得不使用:

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

这一切似乎很好地工作。 但是,我有一个搜索功能,将搜索姓氏并显示结果。 当我寻找,我在为了得到任何结果搜索O \'康纳。

你看,我搜索后,文本框会自动存储什么只是搜索(使用会话)的值。 所以我的代码是这样的:

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

就像我以前说过,当我搜索,我必须使用“O \“康纳”,然后我搜索后,在文本框中的值变为“澳\\\\”康纳”

它一直令人沮丧试图弄清楚这一点。 有谁知道我做错了吗? 谢谢!

编辑:

这里是我的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的,我没有权限编辑该文件:(

Answer 1:

这听起来像魔术引号在PHP配置启用。

要检查它的实际有效:

echo get_magic_quotes_gpc();

要禁用 ,编辑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


Answer 2:

魔术引号启用。 这意味着任何事情放在后或得到或其他类似的位置被自动转义,使初级程序员不必尽可能多的担心。 它是不赞成使用PHP的当前版本,如果我没有记错。

你想做什么就解决这个问题,并有脚本运行的任何配置相同什么如下:

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

    return mysql_real_escape_string($value);
}

您可能需要进一步修改该包装非数字数据的报价,这是一种常见的变化,但我觉得这是更好地手动放置这些报价。



Answer 3:

小编辑到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);
    }
  }


Answer 4:

当它在数据库中,它显示为O \'康纳。

所以,如果我在我的web应用程序回顾过去的名字,我将不得不使用:

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

错误! 当你逃跑用绳子mysql_real_escape_string ,他们只是在查询中逃脱。 数据库解释的查询,以便所述数据库中的数据而没有任何转义字符结束。 您不必使用stripslashes拉出数据库的数据时。 如果你觉得你这样做,那么就意味着在你的数据库中的数据是错位的。 最有可能的,因为你已经魔术引号开启。

你应该:

  • 关闭魔术引号或全球范围内改变其作用。 请参见本手册的细节。
  • 无论是使用绑定参数 (最佳解决方案), 逃避所有的变量mysql_real_escape_string 。 在那里你正在构建的查询,你应该这样做。
  • 这样做你从数据库中拉出的东西什么。

尤其是,不要让一个函数一拉fixinput了在这里的一些答案的上市变种。 这是解决问题的错误的方式,因为它会搞砸了,它不是来自一个http请求的任何数据。



Answer 5:

我不检查get_magic_quotes_gpc是开/关。

我只是做$lname = mysql_real_escape_string(stripslashes($_POST['lname'])); 因此,如果没有它不会带斜杠任何引用的文字..如果有引用它会剥夺他们。

它可以创造奇迹我!



Answer 6:

所有你需要做的就是采取搜索查询,mysql_real_escape_string它,它应该是完美的罚款。 要做到这一点,虽然最好的办法是永远不会存储它逃出来的,而不是仅仅逃脱它的一切是进入数据库。

相反,这样做:

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


文章来源: mysql_real_escape_string and single quote