Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql\u real\u escape\u字符串和单引号_Php_Mysql_Escaping_Mysql Real Escape String - Fatal编程技术网

Php mysql\u real\u escape\u字符串和单引号

Php mysql\u real\u escape\u字符串和单引号,php,mysql,escaping,mysql-real-escape-string,Php,Mysql,Escaping,Mysql Real Escape String,我很沮丧。我希望能够在数据库中插入单引号的名称-例如,O'Connor 因此,在插入数据库时,我会: $lname = mysql_real_escape_string($_POST['lname']); 然后我在数据库中插入$lname 当它在数据库中时,它显示为O'Connor 因此,如果我要在我的web应用程序中回忆起姓氏,我必须使用: $lname = stripslashes($r["lname"]); $lname = stripslashes($r["lname"]);

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

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

 $lname = mysql_real_escape_string($_POST['lname']);
然后我在数据库中插入$lname

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

因此,如果我要在我的web应用程序中回忆起姓氏,我必须使用:

 $lname = stripslashes($r["lname"]);
 $lname = stripslashes($r["lname"]);
这一切似乎都很好。但是,我有一个搜索功能,可以搜索姓氏并显示结果。当我搜索时,我必须搜索奥康纳才能得到任何结果

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

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

你需要做的就是接受搜索查询,mysql\u real\u escape\u string它,它应该是非常好的。但是最好的方法是永远不要存储它,而只是将所有内容都转义到数据库中

相反,请执行以下操作:

$_SESSION['search'] = $_GET['search']; $search = mysql_real_escape_string($_GET['search']); $\会话['search']=$\获取['search']; $search=mysql\u real\u escape\u字符串($\u GET['search']); 听起来像是在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

启用了神奇的引号。这意味着放置在post或get或其他类似位置的任何内容都会自动转义,这样初入程序员就不必担心它。如果我没记错的话,在当前版本的PHP中,它是不推荐使用的

要处理此问题,并让脚本在任何配置中运行相同的脚本,请执行以下操作:

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

    return mysql_real_escape_string($value);
}

您可能想进一步修改它,将非数字数据用引号括起来,这是一种常见的变体,但我发现最好手动放置这些引号。

对fixinput函数进行少量编辑,以检查您的PHP安装是否确实有真正的转义字符串(旧版本没有):


我不检查
get\u magic\u quotes\u gpc
是否打开/关闭

我只是做
$lname=mysql\u real\u escape\u string(stripslashes($\u POST['lname']);
所以如果没有任何引用的文本,它不会删除斜杠。如果有引用,它会删除斜杠

这对我来说是个奇迹

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

因此,如果我要在我的web应用程序中回忆起姓氏,我必须使用:

 $lname = stripslashes($r["lname"]);
 $lname = stripslashes($r["lname"]);
错误!当您使用
mysql\u real\u escape\u string
转义字符串时,它们仅在查询中转义。数据库解释查询,因此数据在数据库中结束时没有任何转义字符。从数据库中提取数据时不必使用
stripslashes
。如果您认为这样做,则意味着数据库中的ata已损坏。很可能是因为您已打开“神奇引号”

你应该:

  • 关闭魔法引号或全局反转其效果。有关详细信息,请参阅
  • 使用(最佳解决方案)或使用
    mysql\u real\u escape\u string
    转义所有变量。您应该在构建查询的地方执行此操作
  • 不要对从数据库中取出的东西做任何事情

特别是,不要在这里列出的
fixinput
和变量中创建函数。这是解决问题的错误方法,因为它会弄乱任何不是来自http请求的数据。

他没有魔法引号,他只是在转义一个转义值。我看不出他在转义哪里两次。对我来说,好像是$u POST['lname']已被转义,因此在调用mysql\u real\u escape\u string后将其添加到DB将以转义状态存储。请查看我的编辑。似乎magic quotes处于打开状态,但我无法编辑php.ini文件,因为它托管在GoDaddy上……在我看来,他在文本框中显示转义值,然后说当他再次搜索时,我t转义转义的值。但是,我可能错了。@behrk2请参阅我关于将其添加到.htaccess文件的说明。您应该能够做到这一点。如果您不能做到这一点,还有最后一个选项-请参见“确定”中的示例#2,但根据所使用的文本,这可能会转换用户提交的文本。在大多数情况下,它会起作用,但不是全部。此外,它可以我只是想说,你一直在一个使用魔法引号的环境中,在这种情况下,你不会有任何问题(除非你尝试将它移植到另一个环境)。@kdluzni..wtf?我写道,它对我来说是个奇迹(这意味着可能不会对每个人都产生“奇迹”)"…我还提到我不检查get_magic…因为我知道它是打开的。是的,但只是说你不检查,而不解释为什么可能会导致OP相信某些东西总是安全的,而它不是。如果你的环境与此相关,那很好,但该方法可能有缺陷,指出它们很重要。此外,magic_引号已被弃用,并将从PHP 6开始删除。届时,您的代码将停止正常工作,而检查gpc的代码将正常工作(直到有一天他们删除了check函数,但听起来不像他们计划这么做)。仅当您在不应该使用的数据上使用它时。说在将数据发送到db之前不使用简化数据安全性的函数等于说您不应该编写验证电话号码的函数,而应该在每次需要时手动放置该代码。或者写任何其他函数来缩短和澄清代码。t函数的要点是在它应该使用的地方使用它