Selectionner seulement les valeurs non nulles dans une BDD

Résolu/Fermé
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 - 19 févr. 2013 à 16:50
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 - 20 févr. 2013 à 13:19
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

ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
19 févr. 2013 à 16:55
tu peux tout faire en une seule boucle.

echo '<select>';
while($donnees = mysql_fetch_array($reponse))
{
     echo '<option>' . $donnees['lieu'] . '</option>';
}
echo '</select>';
1
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
20 févr. 2013 à 11:58
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 :)
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
20 févr. 2013 à 12:03
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
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
20 févr. 2013 à 12:26
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 566
20 févr. 2013 à 12:30
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.
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
20 févr. 2013 à 12:56
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.

0
Utilisateur anonyme
20 févr. 2013 à 13:11
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)<>''
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
20 févr. 2013 à 13:15
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!!
0
chantaussel Messages postés 137 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 9 juillet 2014 30
20 févr. 2013 à 13:19
Youhou, ça marche, je dois effectivement avoir des espaces qui trainent par là.

Merci le père :)
0