2010-10-24 14 views
27

Ho (o no) una variabile $_GET['myvar'] proveniente dalla mia stringa di query e voglio verificare se questa variabile esiste e anche se il valore corrisponde a qualcosa all'interno la mia if:PHP: verifica se la variabile esiste ma anche se ha un valore uguale a qualcosa

Quello che sto facendo e pensare non è il modo migliore per farlo:

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something'): fare qualcosa

la mia domanda è, esiste un modo per fare questo senza dichiarare la variabile due volte ?

Questo è un caso semplice ma immaginate di dover confrontare molte di queste variabili $myvar.

+2

PHP non ha una soluzione per questo, ma è un linguaggio di programmazione. È possibile (e dovrebbe) scrivere sempre un sottoprogramma per abbreviare un codice ripetitivo. Per non parlare del fatto che in un buon programma ogni variabile dovrebbe essere definita prima dell'uso ... –

risposta

15

Purtroppo questo è l'unico modo per farlo. Ma ci sono approcci per gestire array più grandi. Per esempio qualcosa di simile:

$required = array('myvar', 'foo', 'bar', 'baz'); 
$missing = array_diff($required, array_keys($_GET)); 

La variabile $ manca ora contiene un elenco di valori che sono necessari, ma manca l'array $ _GET. È possibile utilizzare l'array $ mancante per visualizzare un messaggio al visitatore.

Oppure si può usare qualcosa di simile:

$required = array('myvar', 'foo', 'bar', 'baz'); 
$missing = array_diff($required, array_keys($_GET)); 
foreach($missing as $m) { 
    $_GET[$m] = null; 
} 

Ora ogni elemento richiesto almeno ha un valore predefinito. Ora puoi usare if ($ _ GET ['myvar'] == 'something') senza preoccuparti che la chiave non sia impostata.

Aggiornamento

Un altro modo per ripulire il codice sarebbe utilizzando una funzione che controlla se il valore è impostato.

function getValue($key) { 
    if (!isset($_GET[$key])) { 
     return false; 
    } 
    return $_GET[$key]; 
} 

if (getValue('myvar') == 'something') { 
    // Do something 
} 
+0

Beh, l'ho visto da queste parti, sperando di essere possibile senza usare array, grazie. –

+0

Aggiornato la mia risposta per mostrare un modo possibile per farlo senza usare un altro array. – mellowsoon

+0

Grazie per il codice Mellowsoon, torna al lavoro ora. –

0

La mia domanda è, esiste un modo per farlo senza dichiarare la variabile due volte?

No, non c'è modo di farlo correttamente senza fare due controlli. I hate it, too.

Un modo per aggirare sarebbe importare tutte le variabili GET rilevanti in un punto centrale in un array o un oggetto di qualche tipo (La maggior parte dei framework MVC fanno automaticamente) e l'impostazione tutte le proprietà che sono necessari in seguito. (Invece di accedere alle variabili di richieste attraverso il codice.)

+0

Basta definire tutte le variabili. Questo è il punto di tutto quel casino. –

+0

Grazie, Pekka, è davvero molto noioso farlo. –

+0

A volte in un grande sistema è difficile prevedere quando verrà visualizzata la variabile, per questo motivo la dichiarazione della variabile potrebbe non essere d'aiuto. Ma hai ragione nella maggior parte dei casi. –

-1

Beh, si potrebbe cavarsela con solo if($_GET['myvar'] == 'something') in quanto tale condizione presuppone che la variabile esiste anche. In caso contrario, l'espressione risulterà anche in false.

Penso che sia giusto farlo all'interno di istruzioni condizionali come sopra. Nessun danno fatto davvero.

+0

E fa scattare un avviso, se l'indice myvar non esiste. – erenon

+1

Vero, ma stai solo testando per quell'indice. IMHO sarebbe davvero pessimo, se quella clausola se non esistesse affatto. Un avviso con cui posso convivere. Dopo tutto, è solo un avviso, che per definizione è innocuo (di solito). – DanMan

+1

Oof, non potrei essere più in disaccordo. Se il tuo obiettivo è creare una base di codice PHP sciatta piena di bug nascosti/silenziosi, ignorare le notifiche sarebbe un ottimo modo per iniziare. Dovresti sempre sviluppare con le notifiche attivate e dovresti sempre considerarle come bug da correggere. –

0

Grazie Mellowsoon e Pekka, ho fatto qualche ricerca qui e venire con questo:

  • Controllare e dichiarare ogni variabile come null (se è il caso) prima di iniziare a usare (come consigliato):
 
!isset($_GET['myvar']) ? $_GET['myvar'] = 0:0; 

* ok questo è semplice ma funziona bene, si può iniziare ad utilizzare la variabile ovunque dopo questa linea

  • che utilizza la matrice di coprire tutti i casi:
 
$myvars = array('var1', 'var2', 'var3'); 
foreach($myvars as $key) 
    !isset($_GET[$key]) ? $_GET[$key] =0:0; 

* dopo che si è liberi di utilizzare le variabili (var1, var2, var3 ... etc),

funzione

PS .: la ricezione di un L'oggetto JSON dovrebbe essere migliore (o una semplice stringa con separatore per esplodere/implodere);

... approcci migliori sono i benvenuti :)


UPDATE:

Usa $ _REQUEST invece di $ _GET, in questo modo si copre entrambi i $ _GET e $ _POST variabili.

 
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0; 
0

perché non creare una funzione per fare ciò, convertire la variabile che si desidera verificare in una variabile reale, ad es.

function _FX($name) { 
    if (isset($$name)) return $$name; 
    else return null; 
} 

poi fare _FX('param') == '123', solo un pensiero

+0

questo ancora emetterà un avviso di errore quando si chiama '_FX ('param')' – hellohellosharp

1

Come mellowsoon suggeriscono, si potrebbe prendere in considerazione questo approccio:

required = array('myvar' => "defaultValue1", 'foo' => "value2", 'bar' => "value3", 'baz' => "value4"); 
$missing = array_diff($required, array_keys($_GET)); 
foreach($missing as $key => $default ) { 
    $_GET[$key] = $default ; 
} 

Hai messo i valori di default e impostare i parametri non recieved a un default valore :)

0

Io uso sempre la funzione utile proprio exst() che dichiara automaticamente varia bles.

Esempio -

$element1 = exst($arr["key1"]); 
$val2 = exst($_POST["key2"], 'novalue'); 


/** 
* Function exst() - Checks if the variable has been set 
* (copy/paste it in any place of your code) 
* 
* If the variable is set and not empty returns the variable (no transformation) 
* If the variable is not set or empty, returns the $default value 
* 
* @param mixed $var 
* @param mixed $default 
* 
* @return mixed 
*/ 

function exst(& $var, $default = "") 
{ 
    $t = ""; 
    if (!isset($var) || !$var) { 
     if (isset($default) && $default != "") $t = $default; 
    } 
    else { 
     $t = $var; 
    } 
    if (is_string($t)) $t = trim($t); 
    return $t; 
} 
+0

Sfortunatamente questo fa scattare un avviso PHP se la chiave dell'array non esiste, vero? –

0

Una soluzione che ho trovato da suonare in giro è quello di fare:

if($x=&$_GET["myvar"] == "something") 
{ 
    // do stuff with $x 
} 
-3

Nessun riferimento ufficiale ma ha funzionato quando ho provato questo:

if (isset($_GET['myvar']) == 'something') 
+1

No. Questo è il confronto tra VERO/FALSO contro "qualcosa". –

0
<?php 

function myset(&$var,$value=false){ 
    if(isset($var)): 
     return $var == $value ? $value : false; 
    endif; 
    return false; 
} 

$array['key'] = 'foo'; 

var_dump(myset($array['key'],'bar')); //bool(false) 

var_dump(myset($array['key'],'foo'));//string(3) "foo" 

var_dump(myset($array['baz'],'bar'));//bool(false) 
0

Questo è simile all'accettazione risposta, ma utilizza invece in_array. Preferisco usare empty() in questa situazione. Suggerisco inoltre di utilizzare la nuova dichiarazione dell'array di stenografia disponibile in PHP 5.4.0 +.

$allowed = ["something","nothing"]; 
if(!empty($_GET['myvar']) && in_array($_GET['myvar'],$allowed)){..} 

Questa è una funzione per verificare più valori contemporaneamente.

$arrKeys = array_keys($_GET); 
$allowed = ["something","nothing"]; 

function checkGet($arrKeys,$allowed) { 
    foreach($arrKeys as $key) { 
     if(in_array($_GET[$key],$allowed)) { 
      $values[$key]; 
     } 
    } 
    return $values; 
} 
5

Se siete alla ricerca di un one-liner per verificare il valore di una variabile non siete sicuri è ancora impostato, questo funziona:

if ((isset($variable) ? $variable : null) == $value) { } 

L'unico punto negativo è che, se stai provando per true/false - null sarà interpretato come uguale a false.

+2

È meglio suggerire '===' di '==', in quanto non avrà lo svantaggio di cui parli. – trincot

Problemi correlati