我很沮丧。我希望能够用单引号插入我的数据库名称 - 例如,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
但是,我的网站托管在GoDaddy上,我无权编辑该文件:(
答案 0 :(得分:7)
听起来PHP配置中启用了Magic Quotes。
检查它是否实际启用:
echo get_magic_quotes_gpc();
To disable,编辑你的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
答案 1 :(得分:1)
启用魔术引号。这意味着放置在post或get或其他类似位置的任何内容都会自动转义,以便初学程序员不必担心它。如果我没记错的话,它在当前版本的PHP中已被弃用。
您要做的是如何处理此问题,并让脚本从任何配置运行相同的内容如下:
function fixinput($value){
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
return mysql_real_escape_string($value);
}
你可能想进一步修改它以将非数字数据包装在引号中,这是一种常见的变体,但我发现最好手动放置这些引号。
答案 2 :(得分:1)
很少编辑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);
}
}
答案 3 :(得分:0)
当它在数据库中时,它显示为O \'Connor。
所以,如果我在网络应用程序中回忆起姓氏,我将不得不使用:
$lname = stripslashes($r["lname"]);
错误!使用mysql_real_escape_string
转义字符串时,它们仅在查询中转义。数据库解释查询,因此数据最终在数据库中,没有任何转义字符。从数据库中提取数据时,不必须使用stripslashes
。如果您认为这样做,则意味着数据库中的数据被破坏。很可能是因为你打开了魔法引号。
你应该:
mysql_real_escape_string
转义所有变量。您应该在构建查询的位置执行此操作。特别是,不要将函数设置为fixinput
以及此处某些答案中列出的变体。这是解决问题的错误方法,因为它会弄乱任何不是来自http请求的数据。
答案 4 :(得分:-1)
我不检查get_magic_quotes_gpc
是否开启。
我只是做$lname = mysql_real_escape_string(stripslashes($_POST['lname']));
所以如果没有任何引用的文字,它就不会剥去斜线..如果有引用它会将它们剥离。
它为我带来奇迹!
答案 5 :(得分:-2)
您需要做的就是使用搜索查询mysql_real_escape_string,它应该是完全没问题的。这样做的最好方法是永远不要存储转义,而只是逃避它,一切都进入数据库。
相反,这样做:
$_SESSION['search'] = $_GET['search']; $search = mysql_real_escape_string($_GET['search']);