Probléme boucle while suivi de if

Eléphant du PHP | 61 Messages

24 avr. 2015, 15:47

Bonjour,

Voici mon problème : Lorsque je fait un SELECT, je souhaite afficher mes résultats (jusqu'ici tout va bien)...

Mais si je veux vérifier si mon tableau de résultat est vide, cela ne marche pas...en effet quand j'affiche mes résultats, je retrouve mes résultats...mais suivi du message : "Aucune réservation n'a eu lieu pour l'hôtel ".$admin->getNameHotel().".".

Et quand ma Base de données est bien vide la phrase s'affiche comme il faut...

Voici mon code :
public function getListBooginkHotel(Admin $admin){
		
		$req=$this->_db->prepare('SELECT * FROM booking WHERE name_hotel=:name_hotels ORDER BY dt_begin ASC');
		
		$req->execute(array(':name_hotels'=>htmlspecialchars($admin->getNameHotel()),
										));
		

		while ($row=$req->fetch()){
		echo "Le client ".$row['name_guest'].", a choisi l'hôtel ".$row['name_hotel']." et le numéro de chambre ".$row['room_number'].", et il a réservé du ".$row['dt_begin']." au ".$row['dt_end']." .<br>
					contact: ".$row['email']."<br><br>" ;
		};
		
		$req->closeCursor();
		
		if(empty($row)){
			
		echo "Aucune réservation n'a eu lieu pour l'hôtel ".$admin->getNameHotel().".";
		}
		}
Si quelqu'un peut m'aider, d'avance merci.

Mammouth du PHP | 688 Messages

24 avr. 2015, 16:04

tu commences par utiliser http://php.net/manual/fr/mysqli-result.num-rows.php pour savoir s'il y a des résultats ou non.

après un while, les variables définies dans la boucle n'existent plus.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 avr. 2015, 09:47

Les boucles ne sont pas des fonctions, les variables définies ou modifiées dans une boucle sont toujours disponibles à la sortie de celle-ci, avec la dernière valeur qui leur a été affectée.

Le problème dans ton cas, c'est que la condition de ta boucle est "tant qu'il reste un enregistrement" ( while($row=$req->fetch()) ). Si tu sors de la boucle, c'est parce que $req->fetch() retourne false (il n'y a pas/plus d'enregistrement à parcourir) et cette valeur est stockée dans ta variable $row lorsque php évalue la condition du while. Ainsi à la sortie de ta boucle, que tu sois rentré dedans où non, $row aura pour valeur false, le empty retournera true et ton message sera affiché...

Selon le traitement que tu veux mettre en place et la base de données utilisée, pour connaître le nombre d'éléments retournés, tu peux faire une autre requête avec un SELECT COUNT(*), faire appel à PDOStatement::rowCount, ou plus simplement compter le nombre d'élément affichés dans php :
$cpt = 0; // compteur à 0
while (...) {
  ...
  $cpt++; // incrémentation du compteur
}
if ($cpt == 0) // test la valeur du compteur
  ...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...