2009-10-19 4 views
0

Le code ci-dessous vérifie les paramètres GET. Il y a deux sélections sur la page qui filtrent une liste par type et groupe d'âge.Existe-t-il un moyen concis de tester les combinaisons de paramètres GET en PHP?

Je cherche un moyen de refactoriser le conditionnel qui teste les combinaisons type/âge. Y a-t-il une façon plus claire/concise de l'écrire?

if (isset($_REQUEST['type']) || isset($_REQUEST['age'])) 
{ 
    // we need to do something 

    $type = ($_REQUEST['type'] == 'all' ? false : (int)($_REQUEST['type'])); 
    $age = ($_REQUEST['age'] == 'all' ? false : (int)($_REQUEST['age'])); 


    // test the possible type/age combinations 

    if ($type && $age) 
    {    
    $cats = $type . "," . $age; 
    } 
    elseif ($type) 
    { 
    $cats = $type; 
    } 
    elseif ($age) 
    { 
    $cats = $age; 
    } 
    else 
    { 
    $cats = false; 
    } 

    // do stuff with $cats; 

} 
+2

Évitez d'utiliser REQUEST- superglobal puisque les données peuvent provenir de sources inattendues (POST, GET & COOKIE). – chelmertz

Répondre

4
$cat = array(
    $_REQUEST['type'] == 'all' ? false : intval($_REQUEST['type']), 
    $_REQUEST['age'] == 'all' ? false : intval($_REQUEST['age']) 
); 

$cat = join(',', array_filter($cat)); 
echo $cat; 

Si les deux [ 'type'] et [ 'age'] sont 'tout' le résultat sera "", à savoir la chaîne (0). Donc ce n'est pas identique. Que ce soit un problème ou non dépend de la façon dont vous utilisez $ cat. Par exemple. if (!$cat) continuera de fonctionner car une chaîne vide est convertie en false dans un contexte booléen.

éditer: oups, et il y a une autre différence. J'utilise array_filter() sans rappel (spécifique).

Si aucun rappel n'est fourni, toutes les entrées d'entrée égales à FALSE (voir converting to boolean) seront supprimées.

E.g. $_REQUEST = array('type'=>'0', 'age'=>'0') entraînera également $cat="".
Est-ce que un problème dans votre contexte?

+0

Notez qu'il est plus sûr d'éviter '$ _REQUEST' et d'utiliser explicitement' $ _GET' ou '$ _POST'. Aide contre CSRF. – slikts

-1

Je ne sais pas si elle est plus claire, mais au moins il est un peu plus concis ... :-)

$cats = str_replace('all', '', "${_GET['type']},${_GET['age']}"); 
$cats = preg_replace('/^,|,$/', '', $cats); 

[EDIT] Donnez une version plus simple ...

Questions connexes