2009-07-30 15 views
7

znajdę w moich stronach PHP I skończyć z linii i linii kodu, które wyglądają tak:Czy istnieje lepszy sposób sprawdzania zmiennych POSTed w PHP?

$my_id = isset($_REQUEST['my_id']) ? $_REQUEST['my_id'] : ''; 
$another_var = isset($_REQUEST['another_var']) ? $_REQUEST['another_var'] : 42; 
... 

Czy istnieje lepszy, bardziej zwięzłe, lub bardziej czytelny sposób sprawdzić tę tablicę i przypisać je zmienna lokalna, jeśli istnieją lub zastosować wartość domyślną, jeśli nie istnieją?

EDYCJA: Nie chcę używać register_globals() - i tak nadal będę miał problem z isset.

+0

Dobre pytanie. –

+0

Za mało przedstawicieli do głosowania, ale lubię te odpowiedzi! – BabyCakes

+1

Wow, ktoś jest szczęśliwy tutaj. Co daje? –

Odpowiedz

6

Jak o zawijaniu go w funkcję?

<?php 

function getPost($name, $default = null) { 
    return isset($_POST[$name]) ? $_POST[$name] : $default; 
} 
+0

Podoba mi się to, ale mój dzienny limit głosowania został osiągnięty. Byłem w trakcie pisania tej samej odpowiedzi. –

+2

Jedyne, co chciałbym zmienić, to nazwa funkcji, na coś krótszego. Myślę, że post() brzmi ładniej. – Thinker

4

lepszą metodą może być utworzenie klasy singleton/static w celu usunięcia szczegółów sprawdzania danych żądania.

Coś jak:

class Request { 

    private $defaults = array(); 
    private static $_instance = false; 

    function getInstance() { 
    if (!self::$_instance) { 
    $c = __CLASS__; 
     self::$_instance = new $c; 
    } 
    return self::$_instance; 
    } 

    function setDefaults($defaults) { 
    $this->defaults = $defaults; 
    } 

    public function __get($field) { 
    if (isset($_REQUEST[$field]) && !empty($_REQUEST[$field])) { 
     return $_REQUEST['field'];   
     } elseif (isset($this->defaults[$field])) { 
     return $this->defaults[$field]; 
     } else { 
     return ''; # define a default value here. 
     } 
    } 
} 

można wtedy zrobić:

# get an instance of the request 
$request = Request::getInstance(); 

# pass in defaults. 
$request->setDefaults(array('name'=>'Please Specify')); 

# access properties 
echo $request->name; 
echo $request->email; 

myślę, że to sprawia, że ​​poszczególne skrypty ładunki czystsze i abstrakty oddalony walidacji itd. Plus mnóstwem zakresie z tym wzorem do rozszerz go/dodaj alternatywne zachowania, dodaj bardziej skomplikowaną domyślną obsługę itp.

+0

Każdy przykład, jak to zadziała? Wygląda na to, że zaciemniłoby to, co się dzieje. Może nie śledzę ... – BabyCakes

+0

tak - wypełniłem to teraz! – benlumley

+0

I tak to lubię - :-) – BabyCakes

1

Jest zbiorem zmiennych, których możesz się spodziewać w momencie pisania skryptu g, czy chcesz to zrobić dla dowolnego zbioru wartości? W pierwszym przypadku jest prawdą, można zrobić coś takiego:

# This array would hold the names of all the variables you're expecting 
# and a default value for that variable name 
$variableNames = array (...); 
foreach ($variableNames as $key => $default) { 
    if (isset ($_REQUEST[$key])) $$key = $_REQUEST[$key]; 
    else $$key = $default; 
} 

Zasadniczo, to wykorzystuje zdolność PHP ocenić zmiennych do tworzenia innych zmiennych (stąd podwójne dolara za $$ klucz - oznacza to stworzenie nowa zmienna, której nazwa jest wartością $ key).

Jeszcze nie wymyśliłem dobrego rozwiązania tej drugiej sytuacji.

2

Najpierw użyj $_POST dla zmiennych POSTed. $_REQUEST to zestaw wielu różnych zmiennych przychodzących, nie tylko $_POST i może powodować problemy.

Jednym z rozwiązań dla twojego pytania byłoby utworzenie funkcji obsługującej logikę isset().

function ForceIncomingValue($Key, $Default) { 
    if (!isset($_POST[$Key])) 
     return $Default; 
    else return $_POST[$Key]; 
} 
+0

tak, czasami używam GET, czasami POST, więc używam _REQUEST – BabyCakes

+2

Ponownie, _REQUEST nie może być zaufany, ponieważ zawiera również dane _COOKIE. Zobacz dokumentację: http://php.net/request – matpie

+0

ciekawe, nie wiedziałem, że – BabyCakes

2

przede wszystkim, nigdy nie używać zmiennej $ _REQUEST, będzie to prowadzić do błędów i innych problemów w trakcie rozwoju


function getPOST($key) { 
    if(isset($_POST[$key])) { 
     return $_POST[$key]; 
    } 
}

uwagę, że kod ten pozostawia pustą zmienną $ _POST gdy [$ key ] nie został ustawiony

można również dostosować ten kod, aby umożliwić użytkownikowi zamiast niego (sensowne) ustawienie domyślne, gdy nie można załadować wartości.

 
function getPOST($key, $default = NULL) { 
    if(isset($_POST[$key])) { 
     return $_POST[$key]; 
    } else { 
     return $default; 
    } 
}
+0

używaliśmy REQUEST w całym miejscu od lat i nie widziałem żadnych problemów. chociaż nie używamy ciasteczek ... może to ma coś z tym wspólnego. – BabyCakes

Powiązane problemy