2009-07-30 12 views
7

trovo nelle mie pagine PHP io alla fine con righe e righe di codice che assomigliano a questo:C'è un modo migliore per controllare le variabili POSTed in PHP?

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

Esiste un modo migliore, più conciso, o più leggibile per controllare questo array e assegnarli a un variabile locale se esistono o applicano un valore predefinito se non lo fanno?

MODIFICA: Non voglio usare register_globals() - Avrei comunque il problema isset.

+0

Una buona domanda. –

+0

Non abbastanza rep per votare ancora, ma mi piacciono queste risposte! – BabyCakes

+1

Wow, qualcuno è molto felice qui dentro. Cosa dà? –

risposta

6

Come avvolgere in una funzione?

<?php 

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

Mi piace questo, ma il limite di voto giornaliero è stato raggiunto. Ero nel mezzo di scrivere la stessa risposta. –

+2

L'unica cosa che cambierei è il nome della funzione, a qualcosa di più breve. Penso che post() suoni meglio. – Thinker

4

un metodo migliore potrebbe essere quello di creare una classe singleton/static per astrarre i dettagli del controllo dei dati della richiesta.

Qualcosa di simile:

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

si può poi fare:

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

penso che questo rende il vostro singoli script carichi più pulito e astrae la convalida ecc più carichi di portata con questo disegno di estendilo/aggiungi comportamenti alternativi, aggiungi più complesse gestioni predefinite ecc. ecc.

+0

Qualche esempio di come funzionerebbe? Sembra che offuscasse quello che sta succedendo. Forse non sto seguendo ... – BabyCakes

+0

sì - lo hai compilato ora! – benlumley

+0

Dopotutto mi piace - :-) – BabyCakes

1

È l'insieme di variabili che stai aspettando noto al momento della scrittura dello script g, o vuoi farlo per un insieme arbitrario di valori? Se il primo è vero, si potrebbe fare qualcosa di simile:

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

Fondamentalmente, questo si avvale della capacità di PHP per valutare le variabili per creare altre variabili (da qui il doppio-dollaro per $$ chiave - questo significa creare una nuova variabile il cui nome è il valore di $ key).

Non ho ancora trovato una buona soluzione a quest'ultima situazione.

2

Innanzitutto, utilizzare $_POST per variabili POSTed. $_REQUEST è un mashup di molte variabili in entrata diverse, non solo $_POST e potrebbe causare problemi.

Una soluzione per la tua domanda sarebbe quella di creare una funzione che gestisca la logica isset().

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

sì, a volte uso GET, a volte POST quindi uso solo _REQUEST – BabyCakes

+2

Ancora, _REQUEST non può essere considerato attendibile in quanto include anche i dati _COOKIE. Vedere la documentazione: http://php.net/request – matpie

+0

interessante, non sapevo che – BabyCakes

2

prima di tutto, MAI utilizzare la variabile $ _REQUEST, sarà portare a bug e altri problemi durante lo sviluppo


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

nota che questo codice lascia il vuoto quando $ _POST [tasto variabile $ ] non è stato impostato

è anche possibile adattare tale codice per consentire all'utente di fornire un valore predefinito (sensibile) quando il valore non può essere caricato.

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

abbiamo usato RICHIESTA in tutto il luogo per anni e non ho visto alcun problema. anche se non usiamo i cookie ... forse questo ha qualcosa a che fare con questo. – BabyCakes

Problemi correlati