2011-04-07 164 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']); 

我希望你可以通過評論解釋每一件事...