4

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

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

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

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

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

因此,如果我要在我的 Web 应用程序中回忆那个姓氏,我将不得不使用:

 $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 上,我没有编辑文件的权限 :(

4

6 回答 6

7

听起来您的 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
于 2009-07-29T15:12:18.873 回答
0

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

您想要处理此问题并让脚本从任何配置运行相同的操作如下:

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

    return mysql_real_escape_string($value);
}

您可能需要进一步修改它以将非数字数据包含在引号中,这是一种常见的变体,但我发现手动放置这些引号会更好。

于 2009-07-29T15:18:56.927 回答
0

对 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);
    }
  }
于 2009-07-29T15:26:04.073 回答
-1

我不检查get_magic_quotes_gpc是开/关。

$lname = mysql_real_escape_string(stripslashes($_POST['lname']));如果没有任何引用的文本,我只是这样做,它不会去除斜杠。如果有引用,它会将它们去除。

它为我创造了奇迹!

于 2009-07-29T15:35:00.093 回答
-1

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

因此,如果我要在我的 Web 应用程序中回忆那个姓氏,我将不得不使用:

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

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

你应该:

  • 全局关闭魔术引号或反转其效果。有关详细信息,请参阅手册
  • 要么使用绑定参数(最佳解决方案),要么使用mysql_real_escape_string. 您应该在构建查询的地方执行此操作。
  • 不要对从数据库中提取的内容执行任何操作。

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

于 2009-07-29T16:45:16.590 回答
-2

您需要做的就是获取搜索查询 mysql_real_escape_string 它,它应该完全没问题。但是,最好的方法是永远不要将其转义,而只是将其转义,所有内容都将进入数据库。

相反,请执行以下操作:

$_SESSION['搜索'] = $_GET['搜索'];
 $search = mysql_real_escape_string($_GET['search']);
于 2009-07-29T15:09:52.903 回答