2011-04-07 119 views
4

我在我的web应用程序中创建了一个只有单个文本字段的表单,并且该字段使用GET发布到PHP页面,但我正在观察奇怪的行为。即当我在我的本地服务器上测试它时,收到的文本是在文本字段中写入的,但是当我将它上载到我的在线服务器时,收到的字符串会自动转义,意味着所有单引号和双引号都会被转义。例如如果我写It's not true...然后在PHP端我会得到PHP转义查询字符串变量

$comment = $_REQUEST["comm"]; 
print $comment; 
//will print It\'s not true... on my online server 
//will print It's not true... on my local server 

我还不能下架,为什么会这样呢?是否有任何PHP设置自动转义查询字符串变量?

回答

9

您已启用“魔术引号”。他们是一个可怕的错误特性,幸运的是在下一个版本的PHP中被删除。 PHP手册有一个guide禁用它们。

总之,你需要设置以下配置项目Offphp.ini文件:

  • magic_quotes_gpc的
  • magic_quotes_runtime的
  • magic_quotes_sybase

具体来说,您的问题似乎是与magic_quotes_gpc - “gpc”部分是“GET,POST和COOKIE“ - 但最好让它们全部禁用。

+0

@Ummar很高兴帮助。 – AgentConundrum 2011-04-07 05:32:14

0

我认为它是在php.ini文件中的一个设置。你可以调用一个PHP函数来禁用它,但那时已经太晚了。

+0

但我们可以编辑php.ini文件。而且还不算太晚 – 2011-04-07 05:28:38

+0

实际上,你只能从'ini_set()'中禁用'magic_quotes_runtime'和'magic_quotes_sybase',我认为这是你所指的功能。 'magic_quotes_gpc'具有'PHP_INI_PERDIR'模式,这意味着它只能从'.htaccess'或者“更高”修改。这很可能是因为一旦函数被调用,gpc超全球已经被设置并且损坏已经完成。 – AgentConundrum 2011-04-07 05:36:42

+0

我不需要'ini_set()'我可以访问'php.ini' – 2011-04-07 06:18:30

2

代码会告诉你一切你需要什么..

function mysql_prep($value) { 
$magic_quotes_active = get_magic_quotes_gpc(); 
$new_enough_php = function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0 
if ($new_enough_php) { // PHP v4.3.0 or higher 
    // undo any magic quote effects so mysql_real_escape_string can do the work 
    if ($magic_quotes_active) { 
     $value = stripslashes($value); 
    } 
    $value = mysql_real_escape_string($value); 
} else { // before PHP v4.3.0 
    // if magic quotes aren't already on then add slashes manually 
    if (!$magic_quotes_active) { 
     $value = addslashes($value); 
    } 
    // if magic quotes are active, then the slashes already exist 
} 
return $value; 
} 

创建上述功能和传递价值观给这个函数

,然后调用值一样

$yourVar = mysql_prep($_POST['yourControlName']); 

我希望你可以通过评论解释每一件事...