2012-05-25 32 views
0

在下面的腳本函數中,clean($ data)調用它,我理解它是如何清除語句中的數據的$ data [clean($ key)] = clean($ value ); ???任何幫助表示讚賞..我想弄明白,因爲我是PHP新手。問候。本身調用PHP函數

if (ini_get('magic_quotes_gpc')) { 
function clean($data) { 
    if (is_array($data)) { 
     foreach ($data as $key => $value) { 
      $data[clean($key)] = clean($value); 
     } 
    } else { 
     $data = stripslashes($data); 
    } 

    return $data; 
}   

$_GET = clean($_GET); 
$_POST = clean($_POST); 
$_REQUEST = clean($_REQUEST); 
$_COOKIE = clean($_COOKIE); 

}

+0

您應該用'get_magic_quotes_gpc()'替換'ini_get'調用。而且我很確定密鑰沒有被轉義 - 所以你可能想要測試它並刪除'clean($ key)',除非它們實際上被轉義了。 – ThiefMaster

+1

我不明白這個問題......你想知道什麼? – DonCallisto

回答

1

你的問題:

所以,如果我undertsand正確的,你想知道什麼是功能線

$data[clean($key)] = clean($value); 

答案做:

查看函數的主要目的是用php的stripslashes方法從字符串中刪除斜線。

如果輸入項是一個數組,則它會嘗試通過調用它自己的鍵和值來清除數組的鍵以及數組的值。

在PHP數組就像包含HashMap,你可以用foreach循環遍歷鍵和值都喜歡以下

foreach ($data as $key => $value) {....} 

所以,如果你想總結一下在你的代碼,算法片斷就會像下

  1. 檢查輸入是否爲數組。如果沒有,那麼去通過調用清潔方法在其上(遞歸地)
  2. 返回到步驟4
  3. 對於數組中的每一項清潔的鍵和值的陣列
  4. 清潔使用的stripslashes方法 5返回輸入字符串清理後的輸入
+0

Thanks Hasan,我知道這個函數在做什麼,但是看到你的第2步。當數據是一個數組時,函數clean將如何清理數據,因爲stripslashes只會在其他部分觸發??????????那麼如果數據是一個數組是我的問題或擔心,那麼如果部分給出了期望的結果。 – user1416732

+0

好的,我已經看到@Cranio給出的答案,他已經很好地解釋了腳本實際上是什麼以及它的邏輯。順便說一句,感謝你們所有人................ – user1416732

0

從我的理解中,它並不清除密鑰,但是在未清除密鑰保留的情況下使用乾淨密鑰創建新元素。

$一個[ '富\酒吧']:VAL \ UE

變得

$一個[ '富\酒吧']:VAL \ UE

$一個[ 'foobar的'] :值

有人糾正我,如果我錯了。

0

也許你會理解的代碼更好,如果我們把這種方式:

foreach ($data as $key => $value) { 
      $key = clean($key); // Clean the key, the 
      $value = clean($value); // Clean the value 
      $data[$key] = $value; // Put it in the array that will be returned 
     } 

假設你有一個這樣的數組: $ _ POST =陣列(0 =>「富」,1 =>陣列('bar'=>'baz')); 將發生以下情況:

Call clean($_POST); 
call clean 0 
call clean 'foo' 
$return[0] = 'foo' 
call clean 1 
call clean 'bar' 
call clean 'baz' 
$return[1] = array('bar' => 'baz'); 

你或許應該這樣說的:http://www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

0

功能的主要目的是乾淨關聯數組單個變量。關聯數組是一個數組,您可以爲該鍵定義鍵和值;所以在PHP中使用的特殊陣列如$_GET$_POST等等。

「清理」的含義是檢查魔術引號是否處於活動狀態 - 當您將動態數據發佈到PHP頁面時,會導致這些數組中的某些字符被反斜槓轉義。 $_GET["Scarlett"] = "O' Hara"變得與魔術引號$_GET["Scarlett"] = "O\' Hara"

所以,如果魔術引號是活動的,功能需要照顧這個,和斜線被剝離,以使字符串保留其正確的,沒有轉義值。

該算法檢查傳遞給函數的數據是否爲數組,如果不是,則直接清除該值。

$string = "Escapes\'in\'a string"; 
clean($string); 
  • 是一個數組?然後返回stripslashes(我的數據)

    $ array = array(「key \'with \'escapes」=>「value \'with \'escapes」,「another \'key」=>「另一個值「); clean($ array)

  • 它是一個數組嗎?是。因此,循環通過每個鍵/值對與foreach,拿鑰匙和清理它像第一個例子;然後取值並執行相同的操作,並將清理過的版本放入數組中。

正如您所看到的,該函數有兩種不同的行爲,即「if」語句。 如果你傳遞一個數組,你激活第二個行爲,依次傳遞字符串,而不是數組,觸發第一個行爲。

雖然我的想法是這個功能無法正常工作。任何人都有同樣的感覺?我還沒有測試它,但它似乎不是「清理」關鍵/值的替換它們的意義,但增加了未清潔版本的清潔版本。

+0

你的回答很好的闡述,並捕捉到腳本正在做什麼,但這個腳本是opencart scource的一部分,否則可能會工作得很好由於該函數在其核心中定義,opencart將會失敗。 – user1416732