我很沮丧。我希望能够插入我的数据库名单的报价,例如,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

但是,我的网站托管关编码,我没有权限以编辑的文件:(

有帮助吗?

解决方案

这听起来像 魔术的报价 在你的PHP配置。

来检查它是否实际上已启用:

echo get_magic_quotes_gpc();

禁用, 编辑php.ini file:

; 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

或加入这条线到你。要:

php_flag magic_quotes_gpc Off

其他提示

魔术的报价是启用。这意味着任何东西放在后,或者获得或者其他类似的位置是自动逃脱以便开始程序员不必担心这样多。它已过时,在当前版本的PHP,如果我记忆正确的。

你想要做什么来处理这个问题,并有剧本的运行相同的任何结构如下:

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

    return mysql_real_escape_string($value);
}

你可能需要进一步修改这个包裹是非数字的数据在报价,这是一个常见的变化,但是我找到最好将这些报价。

小小的编辑fixinput功能检查,如果你安装的PHP确实有真正的逃string(旧版本不):

  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);
    }
  }

当它在数据库,它表现为O\'Connor.

所以,如果我们回顾,最后一名在我的网络应用程序,我将使用:

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

错了!当你逃字 mysql_real_escape_string, 他们是唯一逃出的查询。在解释数据库查询,所以数据结束了在数据库中没有任何逃出的人物。你的 不不 必须使用 stripslashes 当拉数据的数据库。如果你觉得你这样做,那么它意味着,数据库中的数据是错位。最有可能因为你有魔法的报价转。

你应该:

  • 关闭魔术的报价或逆转的影响在全球范围。看看 该手册 对于细节。
  • 要么使用 能参数 (最好的解决方案) 逃避所有的变量 mysql_real_escape_string.你应该这样做,你正在建立的查询。
  • 不做任何事情上你的东西拉出来,从该数据库。

特别是,不使一种功能一拉 fixinput 和变异体中列出的一些问题的答案在这里。它是错误的方式来解决这个问题,因为它会搞砸的任何数据,并不来自一个http请求。

我不检查 get_magic_quotes_gpc 为/关闭。

我只是做 $lname = mysql_real_escape_string(stripslashes($_POST['lname'])); 因此,如果没有任何引用文本它不会条斜线..如果有援引它将带他们。

它创造奇迹我!

所有你需要做的是采取的搜索查询,mysql_real_escape_string,它应该是完美的罚款。最好的方式做到这虽然是从不保存它逃了出来,并而不是仅仅逃脱这一切是进入该数据库。

相反,这样做:

 $_SESSION['search'] = $_GET['search'];
 $search = mysql_real_escape_string($_GET['search']);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top