IF ELSE...récalcitrant

Résolu/Fermé
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 7 avril 2020 à 02:58
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 7 avril 2020 à 09:56
Bonjour,

Ce passage devrait contrôler si le Numéro amené par $Num est dans la table et retourner dans ce cas les Nom et Prénom de la personne, sinon, afficher qu'elle n'est pas inscrite.
L'affichage se fait très bien (partie ELSE ). Si la valeur est dans la table, on a bien le Nom et le Prénom qui s'affiche mais si la valeur n'est pas dans la table, il n'y a pas l'affichage du message "Vous n'êtes pas membre de l'association".

L'affichage des variables donnent pour $donnees soit array quand la valeur est trouvée soit rien quand la valeur n'est pas trouvée dans la table. J'avais essayé avant la condition :
if ($donnees == array()) { ...
sans plus de succès ;-(

Un echo de $reponse donne si la valeur n'existe pas,

[rien et le message "Vous n'êtes pas membre de l'association" ]

ou si la valeur est trouvée

[ PDOStatement Object
(
[queryString] => SELECT DISTINCT Nom, Prenom FROM Inscriptions WHERE Num="123_0"
) et le message "Vous n'êtes pas membre de l'association"]

Là, je patauge dans la semoule.
Voici mon code :

<?php
			try
			{
				// On se connecte à MySQL
				$bdd = new PDO('mysql:host=localhost;dbname=dbbtest;charset=utf8', 'root', 'passs');
			}
			catch(Exception $e)
			{
				// En cas d'erreur, on affiche un message et on arrête tout
					die('Erreur : '.$e->getMessage());
			}
			$reponse = $bdd->query('SELECT DISTINCT Nom, Prenom FROM Inscriptions WHERE Num="'.$Num.'"');
		
			while ($donnees = $reponse->fetch())
				{
					if (empty($donnees)){
					echo '<p align="left">Vous n\'êtes pas membre de l\'association</p>';
					} else { 
					echo '<p align="left"><LABEL for="Nom">Nom  :  </LABEL>';
					echo '<input type="text" name="Nom" value="'.$donnees['Nom'].'"/>';
					echo '        ';
					echo '<LABEL for="Prenom">Prénom :  </LABEL>';
					echo '<input type="text" name="Prenom" value="'.$donnees['Prenom'].'"/></p>';
					}
				}
			unset ($Num);
		
			$reponse->closeCursor(); // Termine le traitement de la requête
	?>




Configuration: Windows / Firefox 74.0 / PHP 5.6.34


--

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 7 avril 2020 à 08:31
Bonjour,

Le problème vient de ton utilisation de while().
While sert à faire une boucle tant qu'une condition est vérifiée.
Donc mécaniquement, à l'intérieur du while, $donnees n'est pas vide car c'est sa condition d'exécution : while ($donnees) revient à dire while ($donnees != false), or quand il n'y a pas de résultat, "false" est la valeur que renvoie ->fetch.

Par ailleurs, le fait d'utiliser while ici est assez étrange : tu t'attends, n'est-ce pas, à n'avoir qu'un seul résultat ? Donc pourquoi boucler ? Tu peux directement récupérer $donnees et le tester comme tu l'as fait, sans le while :
   $donnees = $reponse->fetch();
   if ($donnees === false){
    echo '<p align="left">Vous n\'êtes pas membre de l\'association</p>';
   } else { 
    echo '<p align="left"><LABEL for="Nom">Nom  :  </LABEL>';
    echo '<input type="text" name="Nom" value="'.$donnees['Nom'].'"/>';
    echo '        ';
    echo '<LABEL for="Prenom">Prénom :  </LABEL>';
    echo '<input type="text" name="Prenom" value="'.$donnees['Prenom'].'"/></p>';
   }


Xavier
1
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
7 avril 2020 à 09:41
Bonjour Reivax962,
Un grand merci pour l'explication et la correction apportée qui me permet de progresser en comprenant un peu plus le déroulé.
Daniel
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié le 7 avril 2020 à 08:51
Bonjour,

En complément de la réponse de Reivax :
Quit à utiliser PDO, autant bien le faire.
Pour commencer, il serait bon d'activer la gestion des erreurs de pdo :https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Il serait bien également d'appliquer les conseils donnés ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Puis pour effectuer des requêtes, il est préférable d'utiliser les requêtes préparées au lieu du "query".

Il serait bien également de séparer la connexion à la bdd du reste du code en le plaçant dans un autre fichier que tu n'aurais plus qu'à inclure dans les pages où tu en as besoin au lieu de copier/coller ce code dans tes différents scripts.


Et enfin, voici ce que devrait donnerait ton code :
cnxBdd.php
<?php
//fichier de connexion à la bdd :  cnxBdd.php
try{
    $bdd =new PDO('mysql:host=localhost; dbname=dbbtest; charset=utf8', 'root', 'passs');
    // Activation des erreurs PDO
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
   $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
   die('Erreur : ' . $e->getMessage());
}

?>


Ton script :
<?php
//activation de l'affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//on inclu le fichier de connexion à la bdd
require_once "cnxBdd.php";

//on récupère proprement les variables avant de les utiliser
$Num = !empty($_GET['num']) ? $_GET['num'] : NULL; // a adapter à ton code




//préparation de la requête et des variables
$sql = "SELECT DISTINCT Nom, Prenom 
        FROM Inscriptions 
        WHERE Num=:num ";

$datas = array(':num'=>$Num);

//Execution de la requete
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);
  
  //si une seule ligne de resultat attendu :
  $result = $req->fetch();
  
  //si plusieurs lignes de résultat attendus :
  // $result = $req->fetchAll();// et dans ce cas là, faudra boucler dessus
  
}catch(Exception $e){
  // en cas d'erreur :
   echo " <br>Erreur ! ".$e->getMessage();
   echo " <br>Les datas : " ;
   print_r($datas);
}


//Utilisation du résultat de la requête
if(!empty($result)){
 echo '<p align="left"><label for="Nom">Nom  :  </label>';
 echo '<input type="text" name="Nom" value="'.$result['Nom'].'"/>';
 echo '        ';
 echo '<label for="Prenom">Prénom :  </label>';
 echo '<input type="text" name="Prenom" value="'.$result['Prenom'].'"/></p>';
}else{
  echo "<p align='left'>Vous n'êtes pas membre de l'association</p>";
}
  
?>


1
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
7 avril 2020 à 09:56
Bonjour Jordane,

Oui oui et oui. Je ne peux que dire oui à tes compléments.
Pour le CnxBdd, lorsque j'ai commencé à remplacer le mysql par le pdo, j'avais fait quelques tentatives mais qui c'étaient soldées par des échecs et comme la connexion directement dans le code fonctionnait, j'avais mis ça de côté pour plus tard surtout que le php n'apparait pas dans l'édition du code sur le navigateur et pour éviter de voir les données sensibles lors d'une erreur, on pouvait l'éviter en n'affichant pas les erreurs .... Mais je l'ai toujours à l'esprit de faire ce fichier.
D'autant plus que sur un autre formulaire, pour voir les erreurs, je venais d'activer la gestion des erreurs en mettant à la fin de ma première ligne après le pass ", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)" qui correspond à la partie que tu m'as commentée.

Ta présentation de mon code détaillée et commentée m'est très enrichissante sur la démarche et les étapes à suivre.
Encore un grand merci.

Je vais mettre le sujet en résolu.
0