Özü kullanılması

3 Cevap

Ben OOP yeniyim ve küresellerle kullanarak kurtulmak için bu işlevi yenilemek istiyorum.

    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]);
    }


}

Ben array_map kullanmak için söylendi ve yapıldı sonra extact, ama ben bu yapısı nasıl emin değilim.

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

(Listeleme btw formu adıdır)

Teşekkürler

3 Cevap

Dan $ _GET ve $ _POST gibi dışarıdan girilen değerleri ile özü kullanma konusunda çok dikkatli olun.

Eğer bilinen değerlere el değerleri çıkarılarak daha iyiyiz.

Bu mevcut değişkenleri benzetecek _GET veya _POST bir özü için çok kolay.

Orada söylenecek çok şey vardır ve Jonathan çok iyi bir başlangıç ​​yapar. Kullanıcı içsel veriler ile oynamak için fırsat var ve bunları kontrol yoktur, her zaman, bir şey yanlış giderse o (görünüme bağlıdır ..) büyük bir "fırsat" var. İşte gitmek istiyorum "belki" almak için nasıl bir yaklaşımdır:

<?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);

?>

Dürüst olmak gerekirse, hala gerçekten OOP ile ilgisi yoktur ve ayrıca bir prosedürel bir yaklaşım olarak görülmelidir. Şahsen ben asla bilemezsiniz çünkü bir gün sizin veritabanı veya "kaçış" işlevini değiştirmek isterseniz, girişi "sterilize" ek ve yeniden işlevini kullanın ve sonra tam olarak nerede olası değişiklikler için biliyorum. Ah bir şey daha: Eğer beklemek zorunda tüm değişkenlerin tüm olası isimlerini bilmiyorum emin misiniz? Belki bunları önceden belirlemek ve başka bir dizi koyun ve İn_Array'in her kullanıcı verilen argüman kontrol edebilirsiniz.

Tamamen kod globalsin kullanım kurtulmak için, ve aynı zamanda genel olarak daha iyi yapmak için, bu satırlar boyunca bir şey yapabilirsiniz:

  • bir süper küresel olduğu gibi, $ _POST kullanarak durdurun. Kod superglobals değerleri ihtiyacı olduğunda, parametre olarak onları geçmek
  • $ GLOBALS içine değerleri tutmayın. Eğer birden fazla değer dönmek gerekirse, bir nesne ya da bir dizi dönen düşünün

İşte ben bunu geliştirmek için kodunuzu değiştirmek düşünürdüm nasıl:

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;
}

Bu fonksiyonu kullanmak için, sadece yapmanız $result = CatchListings($_POST);. Aynı sonuç, kullanılan hiçbir globallerinin.

Düşünün bir şey olsa da, var. Bu sadece işlevi için rastgele doldurulmuş dizi (yani $ _POST) geçmek ve özel tuşları (yani $ requiredKeys dizi) içeren beklemek mümkün olan en iyi şekilde olmayabilir. Eksik tuşları kontrol etmek için mantık ekleyebilir veya geçirmeden önce sonrası dizi işlemek ya isteyebilirsiniz.