Selectionner seulement les valeurs non nulles dans une BDD [Résolu/Fermé]

Signaler
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
-
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
-
Bonjour,

J'ai une BDD avec un champ "lieu_n" et un champ "lieu_d". Ils contiennent des noms de villes; parfois la ville n'est pas renseignée la valeur est donc nulle (NULL par défaut). Je veux faire une requête pour récupérer tous les noms de ville qui apparaissent dans ma bdd, sans avoir de doublons, et sans comptabiliser la valeur NULL et regrouper tout ça dans un seul champ "lieu". Le but et de faire apparaitre la liste des villes dans une liste déroulante.

Je fais donc la requête suivante:
(SELECT DISTINCT lieu_n lieu FROM table WHERE lieu_n IS NOT NULL) UNION (SELECT DISTINCT lieu_d lieu FROM table WHERE lieu_d IS NOT NULL) ORDER BY lieu

$i = 1;
while($donnees = mysql_fetch_array($reponse))
{
     $lieu[$i] = $donnees['lieu'];
     $i++;
}
$nblieu = $i - 1;



Et mon code pour la liste déroulante:
<select>
	<?php
	for ($i = 1; $i <= $nblieu; $i++)
	{ ?>
	          <option><?php echo $lieu[$i]; ?></option>
	<?php
	} ?>
</select>


Tout fonctionne bien si ce n'est que j'ai dans ma liste déroulante une ligne vide en première position, qui disparait si je rajoute "if($donnees['lieu']) { (...)" lors de la récupération des données.

Je trouve ça très bizarre, est-ce que quelqu'un saurait comment faire pour ne pas avoir à rajouter ce if, pour que la valeur nulle n'apparaisse pas du tout lors de la requête?

Merci d'avance :)


9 réponses

Messages postés
8319
Date d'inscription
jeudi 22 mars 2007
Statut
Contributeur
Dernière intervention
18 juillet 2018
1 346
tu peux tout faire en une seule boucle.

echo '<select>';
while($donnees = mysql_fetch_array($reponse))
{
     echo '<option>' . $donnees['lieu'] . '</option>';
}
echo '</select>';
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 56912 internautes nous ont dit merci ce mois-ci

Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Oui effectivement, avec while c'est plus simple, mais par curiosité je me demande bien pourquoi il me sort une valeur nulle dans les résultats de la requête.
Merci :)
Messages postés
8319
Date d'inscription
jeudi 22 mars 2007
Statut
Contributeur
Dernière intervention
18 juillet 2018
1 346
il suffit de faire une erreur de manipulation dans tes i pour que le while pédale dans le vide et te donne des résultats vides
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
J'ai fait cette boucle en while tout un tas de fois, pour faire aussi une liste déroulante avec les résultats de la requête et c'est la première fois que ça fait ça. Et il me semble pas que je m'embrouille dans les i? Quand j'écris
$i = 1;
while($donnees = mysql_fetch_array($reponse))
{
     $lieu[$i] = $donnees['lieu'];
     $i++;
} 

c'est quand même assez simple il me semble?
Merci.
Messages postés
8319
Date d'inscription
jeudi 22 mars 2007
Statut
Contributeur
Dernière intervention
18 juillet 2018
1 346
c'est surtout ce que tu fais ton i par le suite qui peut perturber, mais faire 2 boucles successives qui va foire le même nombre de tours, ça ne sert à rien, ça peut être source d'erreur, la preuve en image.
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Je viens de simplifier ma page, juste pour faire un test. Je fais donc une boucle en while pour la requête, puis une en for pour l'affichage de la liste déroulante. Oui, j'utilise le "même" $i pour mes deux boucles, mais je lui redonne la bonne valeur de départ à chaque fois. (C'est exactement le code que j'ai posté dans le 1er message)

Et j'ai toujours ma ligne vide. Si je fais exactement la même chose mais en faisant une requête sur un autre champ je n'ai plus de ligne vide. Je ne pense donc pas que ça vienne de ma boucle, qui fonctionne très bien, mais de la requête qui me renvoie des données nulles malgré le "WHERE lieu IS NOT NULL". Honnêtement ce n'est dramatique, car un if règle le problème, mais c'est juste bizarre.
Merci de ton aide.


Bonjour

WHERE lieu IS NOT NULL élimine les lignes où lieu est NULL, mais pas les lignes ou lieu est une chaîne vide ou simplement constituée d'espaces.
Essaye
...WHERE lieu IS NOT NULL AND TRIM(lieu)<>''
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Oui, c'est ce que j'ai pensé au début aussi, mais j'ai classé mon champ par ordre alphabétique pour vérifier tout ça, et toutes les cellules vides ont bien la case NULL qui est cochée... Très zarbi, mais je vais quand même essayer ta technique pour voir.

Merci!!
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Youhou, ça marche, je dois effectivement avoir des espaces qui trainent par là.

Merci le père :)