我很沮丧。 我希望能够插入到用单引号我的数据库的名称 - 例如,奥康纳。
因此,插入数据库时,我做的:
$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的,我没有权限编辑该文件:(
这听起来像魔术引号在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
魔术引号启用。 这意味着任何事情放在后或得到或其他类似的位置被自动转义,使初级程序员不必尽可能多的担心。 它是不赞成使用PHP的当前版本,如果我没有记错。
你想做什么就解决这个问题,并有脚本运行的任何配置相同什么如下:
function fixinput($value){
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
return mysql_real_escape_string($value);
}
您可能需要进一步修改该包装非数字数据的报价,这是一种常见的变化,但我觉得这是更好地手动放置这些报价。
小编辑到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);
}
}
当它在数据库中,它显示为O \'康纳。
所以,如果我在我的web应用程序回顾过去的名字,我将不得不使用:
$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']);