IF ELSE...récalcitrant
Résolu
danielos77
Messages postés
108
Date d'inscription
Statut
Membre
Dernière intervention
-
danielos77 Messages postés 108 Date d'inscription Statut Membre Dernière intervention -
danielos77 Messages postés 108 Date d'inscription Statut Membre Dernière intervention -
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 :
--
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
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 :
Xavier
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
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
Ton script :
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>"; } ?>
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.
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.
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