2013-06-24 2 views
1

J'ai un champ <select> et je veux avoir la <option> appropriée choisie en fonction de ce que la valeur GET est Je l'ai utilisé une déclaration ternaire pour produire un attribut selected comme ceci:PHP isset pour la variable GET dans l'opérateur ternaire

<select name="data" id="data"> 
    <option value="1" <?php echo $_GET['data'] == '1' ? 'selected' : '' ; ?>>One</option> 
    <option value="2" <?php echo $_GET['data'] == '2' ? 'selected' : '' ; ?>>Two</option> 
    <option value="3" <?php echo $_GET['data'] == '3' ? 'selected' : '' ; ?>>Three</option> 
</select> 

le problème est, lorsque la page le premier chargement il n'y a pas tableau $_GET si je reçois une erreur de php dans ma boîte de sélection:

Notice: Undefined index: données ...

J'ai essayé d'utiliser isset d'abord vérifier si le tableau est réglé avant de vérifier si la valeur correspond à:

<option value="1" <?php echo isset($_GET) && $_GET['data'] == '1' ? 'selected' : '' ; ?>>One</option> 

Ce retourne la même erreur.

Quelle est la meilleure façon de gérer cette erreur de manière concise et de réaliser ce que je veux?

+5

$ _GET est toujours défini! vous devez vérifier le paramètre avec isset ($ _ GET ['data']) – Waygood

+1

@Waygood vous avez raison. poster comme réponse et je vais accepter. – harryg

+1

Votre réponse acceptée est bonne. Pour la première itération seulement, et provoque la répétition. – Jimbo

Répondre

0

Essayez comme

<option value="1" <?php echo (isset($_GET['data']) && $_GET['data'] == '1') ? 'selected' : '' ;?> >One</option> 
+0

Une raison de downvote ..? – Gautam3164

+0

Vous ne savez pas, bien que peut-être que cela viole le [principe DRY] (http://en.wikipedia.org/wiki/Don't_repeat_yourself)? – Jimbo

+0

Je n'ai parlé de la condition que pour les options entières ... juste son refernce pour la condition ternaire @Jimbo – Gautam3164

3

essayer,

<option value="1" <?php echo isset($_GET['data']) ? ($_GET['data'] == '1' ? 'selected' : '') : ''; ?>>One</option> 
+0

Fonctionne mais pas le plus efficace ou lisible. Les déclarations ternaires imbriquées est quelque chose que je veux éviter – harryg

3

Vous pouvez utiliser une boucle for et imprime uniquement la variable $selected lorsque votre exigence est vrai. Cela vous évitera de vous répéter.

<select name="data" id="data"> 
    <?php for ($i = 1; $i <= 3; $i++) { ?> 
     <?php $selected = (isset($_GET['data']) && $_GET['data'] === $i) ? 'selected' : ''; ?> 
     <option value="<?=$i?>" <?=$selected?>><?=$i?></option> 
    <?php } ?> 
</select> 

Note: J'utilise PHP 5.4, donc peut légitimement utiliser de court écho PHP qui, à mon avis, sont beaucoup plus agréable dans les vues/modèles

Si vous voulez afficher du texte pour les chiffres et don ne veux pas le faire manuellement, en utilisant un tableau, vous pouvez vérifier le paquet Numbers_Words de Pear.

+0

Ce serait généralement la route que je prendrais mais vu que je n'ai que 3 '' Je me sentais construire un tableau et l'utilisation d'une boucle 'for' serait trop lourde et réduirait le code lisible. Juste réponse cependant.(Je préférerais aussi une boucle 'foreach' dans cette instance car elle ne nécessite pas de connaître la longueur du tableau et les clés de l'élément - mes données ne sont pas réellement des nombres). – harryg

+0

La seule raison pour laquelle je n'ai pas suggéré 'foreach()' est parce que vous auriez besoin de quelque chose pour itérer autour, et vous n'aviez pas cela quelque chose;) Mais cool. Quelque chose de similaire à cela pour éviter la duplication de code est toujours un bon pas en avant. – Jimbo