IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

problème sur condition (if / elseif / else)


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut problème sur condition (if / elseif / else)
    Bonjour.


    J'essaie de faire un ajout dans une BDD avec une condition mais je rencontre un problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    $requeteElements = $pdo->prepare('INSERT INTO Elements (...) VALUES(:...)');
    $requetVerifElements = $pdo->prepare('SELECT COUNT(...) FROM Elements WHERE nom=:nom');
     
    $nbElements = count($listeElements);
    for($i=0 ; $i<$nbElements ; $i++) {
        $cElem = $listeElements[$i][0];
     
         $requetVerifElements -> bindParam(':nom'=>$cElem["nom"]);
        $return = $requetVerifElements -> execute();
        $data = $requetVerifElements->fetch();
     
        if($return == FALSE)
            { break 2; }
        elseif($data == 0)
            { $return = $requeteElements -> execute(array(...)) or die("Erreur SQL!"); }
        else
            { $test = 1; }
    }
    Si j'ai le retour de mon comptage qui est faux, je sors.
    Sinon, si l'élément n'existe pas déjà, je l'ajoute.
    Sinon test =1.

    Je ne comprends pas pourquoi ça fonctionne sans le else mais dés que je rajout cette condition, ça ne marche plus.
    Je fais appel à ce scipt via une requête AJAX et je n'arrive pas à localiser le problème. Je sais par contre que mes requêtes SQL sont correctes.

    Quelqu'un pourrait-il m'apporter son aide =)?

    Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par flavors Voir le message
    if($return == FALSE)
    { break 2; }
    elseif($data == 0)
    { $return = $requeteElements -> execute(array(...)) or die("Erreur SQL!"); }
    else
    { $test = 1; }
    Selon ton premier test la variable $return est booléenne.Voilà ce que fait ton branchement conditionnel :

    si $return = faux exécution du premier code sinon si $data = 0 exécution du 2ème code sinon tu initialises une variable à 1 or $data est de type différent que $return et surtout vu qu'une booléenne ne prenne que 2 valeur donc après le IF c'est le ELSE qui doit automatiquement suivre mais il ne peux pas avoir un 3ème test sur cette variable.donc si tu veux utiliser $data fais un autre IF à part.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    fetch retourne un tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $data = $requetVerifElements->fetch(PDO::FETCH_NUM);
    if($data[0] == 0) {
    Egalement ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nbElements = count($listeElements);
    for($i=0 ; $i<$nbElements ; $i++) {
        $cElem = $listeElements[$i][0];
    s'écris proprement comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach ($listeElements as $value) {
         $cElem = $value[0];
    et ton test
    signifierait que ta requête ne fonctionne pas.
    ce n'est pas vraiment le sujet.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Merci pour vos réponses.

    if($return == FALSE)
    signifierait que ta requête ne fonctionne pas.
    ce n'est pas vraiment le sujet.
    Si on sait que notre requête SQL est correct, il est inutile de la tester en faisant ça?
    Dans le cas d'un ajout on peut quand même mettre ce test? Par exemple pour pouvoir faire un retour à l'utilisateur si il essaie de rentrer un champ déjà existant en BDD?

    Je rencontre le même probléme.
    J'ai remplacé mon code avec ce que vous m'avez dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach ($listeElements as $value) {
        $cElem = $value[0];
     
        $requetVerifElements -> bindParam(':nom'=>$cElem["nom"]);
        $return = $requetVerifElements -> execute();
        $data = $requetVerifElements->fetch();
     
        if($data[0] == 0)
            { $return = $requeteElements -> execute(array(...)) or die("Erreur SQL!"); }
        else
            { $test = 1; }
    }
    Encore une fois sans le else ça passe mais avec ça ne fonctionne pas.

    Merci.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le symptome que tu décris n'est pas possible puisque ton else ne fait rien. Je pense que tu interpretes mal tes résultats.
    De plus tu n'as pas mis le PDO::FETCH_NUM de mon code.

    Un simple echo te montrera ce que fais ton traitement exactement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    foreach ($listeElements as $value) {
     
        $requetVerifElements -> bindParam(':nom'=>$value[0]['nom']);
        $return = $requetVerifElements -> execute();
        $data = $requetVerifElements->fetch(PDO::FETCH_NUM);
     
        if($data[0] == 0)
            { 
                $return = $requeteElements -> execute(array(...)) or die("Erreur SQL!"); }
                echo 'nom  : ' . $value[0]['nom'] .  ' non trouvé ; count = ' . $data[0] . ' - Insertion <br/>';
        else
            { 
                $test = 1;
                echo 'nom  : ' . $value[0]['nom'] .  ' trouvé ; count = ' . $data[0] . '<br/>';    
        }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Je n'y comprends rien.

    J'ai mis votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if($data[0] == 0)
            { 
                echo 'nom  : ' . $value[0]['nom'] .  ' non trouvé ; count = ' . $data[0] . ' - Insertion <br/>';
            }
    else
            { 
                echo 'nom  : ' . $value[0]['nom'] .  ' trouvé ; count = ' . $data[0] . '<br/>';    
            }
    echo $value[0]['nom']."<br/>";
    echo $data[0]."<br/>";
    Donc quand je laisse le else ça ne marche pas (j'ai Status Code:500 Internal Server Error dans l'outil developper).
    Par contre quand je ne l'ai pas , j'ai bien le nom et 1 ou 0 (de data[0]) qui s'affiche avec le if si la condition est remplie.

    Pourtant le else est correct, je ne vois pas d'accolade manquante ou d'erreur de syntaxe...

    PS : j'ai bien ajouté le fetch(PDO::FETCH_NUM)

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Consulte tes logs d'erreur PHP.
    Erreur 500 c'est ce que donne un serveur qui n'affiche pas les erreurs.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Je ne savais pas que l'on pouvait voir les erreurs comme ça.
    Apparemment il y avait une accolade en trop mais qui n'était pas affichée...

    Quand vous m'aviez dis que le test sur le retour de la requête SQL n'était pas dans le sujet.
    Ca veut dire qu'il est inutile de la faire car on sait que la requête est juste ?

    Merci.

  9. #9
    Membre éclairé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2012
    Messages : 416
    Points : 747
    Points
    747
    Par défaut
    Citation Envoyé par flavors Voir le message
    Ca veut dire qu'il est inutile de la faire car on sait que la requête est juste ?
    Tu ne peux JAMAIS être certain qu'une requête renvoie un résultat valide. Il est recommandé de toujours tester les retours (comme il faut tester tout ce qui est envoyé par l'utilisateur).

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    D'accord je pense avoir compris.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if($return == FALSE)
        //J’arrête tout et j'informe l'utilisateur qu'il y a une problème au niveau d'une requête
     
    else
        // je remet ma vérification 
        if(data[0]==0)
            // j'ajoute
        else
            // j'informe l'utilisateur qu'il existe déjà
    Du coup la ce n'est plus hors sujet puisque je test ma requête avant et seulement après j'execute mes actions selon si la requête est bonne ou pas ?

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je voulais dire que tu mélanges la valeur du retour de la requête et le fonctionnement de la base de données.

    Comme tu n'as pas de solution alternative en cas de dysfonctionnement, autant activer les exceptions PDO et stopper le code purement en cas de problème.
    Ou alors si tu veux vraiment gérer les erreurs de la base données fait toi une classe qui traite les accès à la base de données, car tu ne vas pas pour chaque requête mettre des if{} pour contrôler si l'execution a fonctionné.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    D'accord.
    J'ai fais quelques rapides recherches, j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Mais il faut faire un catch pour chaque requête pour avoir un retour sur l'erreur, sinon l'application plante?
    Dans ce cas est-ce que l'utilisation d'un "or die" pourrait convenir?
    Parce que c'est un peu embêtant si l'utilisateur se retrouve bloqué sans comprendre.

  13. #13
    Membre actif
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Points : 202
    Points
    202
    Billets dans le blog
    3
    Par défaut
    Le or die("xxx"); arrête l'exécution de ton script SQL, tandis qu'avec le "try catch" tu peux continuer ton script même s'il y a une erreur (de plus tu peux savoir de qu'elle erreur il s'agit), tu peux même rajouter "finally" pour exécuter le code que tu auras mis dedans quelques soit le résultat du "try".

    Et rien ne t'empêche d'afficher les erreurs avec $e->getMessage();.

    Plus d'info, je te renvoi vers la doc: http://us2.php.net/manual/fr/language.exceptions.php

    Pour info "die" est un alias de "exit", donc ce qui veut bien dire "stop le script" !!

    Bien à toi,
    Pensez à mettre comme si c'est le cas !

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Ok Merci bien pour l'explication!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème sur condition IF
    Par asty69 dans le forum Débutez
    Réponses: 6
    Dernier message: 30/05/2011, 13h38
  2. Problème sur condition 'if '
    Par chrystobale dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 19/03/2009, 16h32
  3. [XSLT] Problème de condition sur un XSLT
    Par alex.nd dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/09/2006, 15h16
  4. problème sur une condition if
    Par boss_gama dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/07/2006, 12h04
  5. Réponses: 4
    Dernier message: 13/02/2006, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo