Используя экстракт - PullRequest
0 голосов
/ 14 июня 2009

Я новичок в ООП и хочу модернизировать эту функцию, чтобы избавиться от использования глобалов.

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


}

Мне сказали использовать array_map и затем extact, но я не уверен, как это структурировать.

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

(в списке указано название формы)

Спасибо

Ответы [ 3 ]

1 голос
/ 14 июня 2009

Будьте ОЧЕНЬ осторожны при использовании извлечения с внешне введенными значениями из $ _GET и $ _POST.

вам гораздо лучше извлекать значения вручную в известные значения.

Извлечение из _GET или _POST слишком просто, чтобы забить существующие переменные.

0 голосов
/ 14 июня 2009

Чтобы полностью избавиться от использования глобалов в вашем коде, а также сделать его намного лучше в целом, вы можете сделать что-то вроде этого:

  • прекратите использовать $ _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). Возможно, вы захотите либо добавить логику для проверки отсутствующих ключей, либо обработать массив записей перед его передачей.

0 голосов
/ 14 июня 2009

Есть так много вещей, чтобы сказать, и Джонатан делает очень хорошее начало. Каждый раз, когда у пользователя есть возможность поиграть с вашими внутренними данными, а вы их не проверяете, появляется огромная «возможность» (зависит от представления ..), что что-то идет не так. Вот еще один подход к тому, как «возможно» попасть туда, куда вы хотите пойти:

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

?>

Если честно, это все равно не имеет ничего общего с ООП , и, кроме того, его следует рассматривать как процедурный подход. Лично я бы использовал дополнительную и многократно используемую функцию для «дезинфекции» ввода, потому что вы никогда не знаете, если когда-нибудь вы захотите изменить свою базу данных или функцию «escape», и тогда вы точно будете знать, где искать возможные изменения. Ах, еще одна вещь: вы уверены, что не знаете всех возможных имен всех переменных, которые вы должны ожидать? Может быть, вы можете заранее определить их и поместить в другой массив и проверить каждый предоставленный пользователем аргумент с помощью in_array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...