2009-06-14 3 views
0

저는 OOP을 처음 접했고 전역 함수 사용을 제거하기 위해이 함수를 개선하고 싶습니다.추출물 사용하기

function CatchListing() { 

    $parseform = array('itemnum','msrp','edprice','itemtype','box','box2','box25','box3','box4','box5','box6','box7','itemcolor','link'); 

    foreach ($parseform as $globalName) { 
     $GLOBALS[$globalName] = mysql_real_escape_string($_POST[$globalName]); 
    } 


} 

가 나는 다음 extact & array_map 사용하는 말했지만, 나는이를 구성하는 방법을 잘 모르겠습니다했다.

function CatchListing() { 
    $_POST['listing'] = array_map('mysql_real_escape_string', $_POST); 
    $nst = extract($_POST['listing']); 
} 

감사

답변

1

(목록은 BTW 양식 이름)에서 $ _GET과 $ _POST로 외부 입력 값으로 추출물을 사용하는 방법에 대한 매우주의해야합니다.

값을 수동으로 알려진 값으로 추출하는 것이 좋습니다.

_GET 또는 _POST의 추출물로 인해 기존 변수가 너무 쉽게 구별됩니다.

+0

제 의견으로는 extract()가 PHP에서 가장 해킹당한 끔찍한 해킹입니다. 그러나 사용을 고집한다면 다양한 옵션 (두 번째 매개 변수)을 지원한다는 것을 알고 있어야합니다. 예를 들어, EXTR_SKIP는 기존 변수 중 하나를 훼손하지 않습니다. –

+0

@artem, 사실, 나는 그것에 대해 잊어 버렸습니다. 나는 극히 드문 경우를 제외하고는 일반적으로 그것을 피합니다. –

0

조나단 (Jonathan)은 말하기가 너무나 많습니다. 사용자가 내부 데이터를 가지고 놀 기회가 있으며 확인하지 않을 때마다 무언가가 잘못되었다는 큰 "기회"(보기에 따라 다름)가 있습니다. 여기에 당신이 가고 싶은 곳 "어쩌면"하는 방법에 대한 또 다른 접근 방식입니다 :

<?php 

function Sanitize($string){ 
    return mysql_real_escape_string(trim($string)); 
} 

function CatchListing(){ 
    foreach($_POST as $key => $value) { 
    $key = Sanitize($key); 
    $value = Sanitize($value); 
    if($key && $value && !$GLOBALS[$key]){ /* prevent overwriting existing globals*/ 
     $GLOBALS[$key] = $value; 
    } 
    } 
} 

global $nice; 
$nice = "working"; 

CatchListing();  

print_r($GLOBALS); 

?> 

는 솔직히 말해서, 그것은 여전히 ​​정말 OOP와 아무 않았으며 또한 절차 적 접근 방식으로 볼 수 있습니다. 개인적으로 나는 언젠가는 데이터베이스 나 "탈출"기능을 바꾸고 싶을 때 가능한 변경을 찾을 곳을 정확히 알기 때문에 입력을 "살균"하기 위해 추가적이고 재사용 가능한 기능을 사용할 것입니다. 아, 한 가지 더 : 기대해야 할 모든 변수의 가능한 모든 이름을 모르는 것이 확실합니까? 어쩌면 당신은 그들을 미리 결정하고 다른 배열에 넣고 in_array를 사용하여 각 사용자가 제공 한 인수를 확인할 수 있습니다.

0

완전히 코드에서 전역의 사용을 제거하고, 또한 더 나은 전반적인, 당신이이 라인을 따라 뭔가를 할 수 있도록 : 그것은 자동 전역의로,

  • 정지 $ _POST를 사용하여. 슈퍼 전역에서 값을 필요로하는 코드는 매개 변수로 전달하십시오.
  • 값을 $ GLOBALS에 저장하지 마십시오. 당신이 단순히

    function CatchListings($listings) {  
        $filteredListings = array_map('mysql_real_escape_string', $listings); 
    
        //I assume you only need the values in the array in the original snippet, 
        //so we need to grab them from the parameter array and return only that 
        $requiredListings = array(); 
        $requiredKeys = array('itemnum','msrp','edprice','itemtype','box','box2','box25','box3','box4','box5','box6','box7','itemcolor','link'); 
        foreach($requiredKeys as $key) { 
         $requiredListings[$key] = $filteredListings[$key]; 
        } 
    
        return $requiredListings; 
    } 
    

    가이 기능을 사용하려면 : 둘 이상의 값을 반환해야 할 경우, 개체 또는 여기

내가 그것을 개선하기 위해 코드를 수정 것이라고 생각하는 방법은 배열을 반환 고려 $result = CatchListings($_POST);하십시오. 동일한 결과, 전역 변수가 사용되지 않았습니다.

고려해야 할 한 가지가 있습니다. 무작위로 채워진 배열 (즉, $ _POST)을 함수에 전달하고 특정 키 (예 : $ requiredKeys 배열)를 포함 할 것으로 기대하는 것이 최선의 방법 일 수는 없습니다. 누락 된 키를 확인하기 위해 논리를 추가하거나 전달하기 전에 게시 배열을 처리 할 수 ​​있습니다.