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
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
2 réponses
Reivax962
Messages postés
3672
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
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 :
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
jordane45
Messages postés
38463
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 avril 2025
4 741
Modifié le 7 avril 2020 à 08:51
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
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>"; } ?>
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
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.
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.
7 avril 2020 à 09:41
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