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 :

[Système] if() exécuté mais else() aussi


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut [Système] if() exécuté mais else() aussi
    Salut,

    Dans mon code j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (!ereg("(.*)".$cat."(.*)", $str_cats)) {
       $str_cats .= $cat;
       $connection->query("UPDATE its_parametres SET valeur = ".quote_smart($str_cats)." WHERE parametre = 'cats'");
    }
    else 
       $_SESSION['erreur'] = "Catégorie déjà existante";
    Je problème c'est que l'édition est faite dans ma base de donnée, mais que j'ai la session erreur qui est définie
    J'ai fais des print_r($_SESSION) avec et après cette partie et la session erreur est bien définie ici.

    Comme ça se fait?
    Merci

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Tu es sûr que la variable de session n'est pas définie avant ? Genre, ça te dirait pas de faire un petit unset dessus avant ton if/else ?

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci mais ça ne change rien.
    Si je commente la ligne de la requête plus d'édition, mais plus de message d'erreur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    mets des accolades dans le pire des cas (c plus propre)
    sinon je pense pareil ta session doit etre defini quelque part avant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (!ereg("(.*)".$cat."(.*)", $str_cats))
    {
       $str_cats .= $cat;
       $connection->query("UPDATE its_parametres SET valeur = ".quote_smart($str_cats)." WHERE parametre = 'cats'");
    }
    else 
    {
       $_SESSION['erreur'] = "Catégorie déjà existante";
    }

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Au passage, ta regex est très peu optimisée.
    Voici ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('/'.$cat.'/', $str_cats)
    J'ai changé de POSIX avec ereg() à PCRE avec preg_match() : plus rapide, plus intéressant à tous les niveaux.
    J'ai également supprimé les .* qui ne servaient à rien. Cela devrait largement améliorer les perfs de la regex, même si tu ne le remarqueras probablement pas.

    Pour terminer, une structure if/else ne passera jamais dans les deux branches à la fois. Pour t'en assurer, tu peux exécuter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (!preg_match('/'.$cat.'/', $str_cats))
    {
       echo 'if';
       $str_cats .= $cat;
       $connection->query("UPDATE its_parametres SET valeur = ".quote_smart($str_cats)." WHERE parametre = 'cats'");
    }
    else 
    {
       echo 'else';
       $_SESSION['erreur'] = "Catégorie déjà existante";
    }

  6. #6
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci pour le preg_match c'était un peu trivial
    Sinon c'est toujours aussi louche: le else est affiché, mais pourtant l'update est faite. Le script doit repasser par la mais le if ne s'affiche pas.

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Si "if" n'est pas affiché, alors ton script ne passe pas dans le if. Si la requête est exécutée sans que "if" soit affiché, c'est assurément que tu l'as également mise ailleurs.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    je pense que si tu n'utilises pas d'accolades pour ton else, le code du else doit être écrit juste derrière le else et non dans la ligne en dessous

    donc, à mon avis, ta session(erreur) n'est pas considérée comme faisant partie du else mais simplement une instruction qui suit le if/else

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Non non, après un else, PHP exécute jusqu'au premier point virgule. Peu importent les sauts de ligne et autres espaces.

  10. #10
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Bon je crois que je vais craquer tout seul parce que je ne trouve pas du tout. Il doit y avoir un joli super méga bug...
    J'ai deux pages liées et sur les deux je n'ai que 2 déclaration de la session. En commentant la seconde, je suis certain que la session erreur vient de ce que je vous ai montré.
    J'ai tout regardé sans résultat... Je vais essayer autre chose

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    es-tu sûr de ne pas avoir le même script deux fois dans ta page, et que tu passes une fois avec le if et l'autre fois avec le else ?

    ou que c'est un include ?

    ne peux-tu remettre ton dernier code (si tu l'as changé) et dans le cas contraire un peu plus de code si ce n'est toute la page (j'espère qu'elle ne fait pas 3 km)

  12. #12
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Actuellement j'ai ça mais je pense que je vais changer en + les explode sur chaine je trouve ça pas joli...

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    case 'EDIT_DELETE_CAT':
                global $connection, $str_cats;
                $categories = $connection->variable("cats");
                if ($_POST['to_do_cat'] != 'none') {
                   if ($_POST['do_cat'] == "Supprimer") {
                      $categories_explode = explode(",", $categories);
                      for ($i = 0; $i < count($categories_explode); $i++) {
                         if ($categories_explode[$i] != $_POST['to_do_cat'] && !empty($categories_explode[$i]))
                            $str_cats .= $categories_explode[$i].',';
                      }
                      $str_cats = substr($str_cats, 0, strlen($str_cats) - 1);
                      $connection->query("UPDATE its_parametres SET valeur = '".$str_cats."' WHERE parametre = 'cats'");
                      $connection->query("UPDATE its_links SET cat = 'Divers' WHERE cat = '".$_POST['to_do_cat']."'");
                   }
                   elseif ($_POST['do_cat'] == "Editer") {
                      $cat = trim($_POST['name_new_cat']);                  
                      $categories_explode = explode(",", $categories);
                      for ($i = 0; $i < count($categories_explode); $i++) {
                         if ($categories_explode[$i] != $_POST['to_do_cat'] && !empty($categories_explode[$i]))
                            $str_cats .= $categories_explode[$i].',';
                      }
                      if (!preg_match('/'.$cat.'/', $str_cats)) {
                         $str_cats .= $cat;
                         echo 'ok';
                         $connection->query("UPDATE its_parametres SET valeur = ".quote_smart($str_cats)." WHERE parametre = 'cats'");
                      }
                      else {
                         $_SESSION['erreur'] = "Catégoris déjà existante";
                      }
                  }
                }
                header("Location: account.php?op=liens");
                break;

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    comme cela à vue de nez il n'y a rien de particulier

    mais je vois que toute cette séquence fait partie d'un switch.
    n'y aurait-il pas un autre case avant, sans break, qui exécute ta requête ?

    sinon je ne vois qu'une seule façon pour toi de debugger, c'est de mettre des echo d'un numéro un peu partout, afin de voir quel part du script est exécutée

  14. #14
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Ouai j'ai regardé les break et y'a pas de problème. Je crois que après changé ma structure de bdd je vais revoir ça.
    Merci

  15. #15
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Bon j'ai change ma structure de code et maintenant j'ai ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    elseif ($_POST['do_cat'] == "Editer") {
       $cat = quote_smart(trim($_POST['name_new_cat']));
       $old_cat = quote_smart($_POST['to_do_cat']);
       print_r($_SESSION);
       if ($connection->linesw("its_cat", "text=".$cat) == 0) {
          $connection->query("UPDATE its_cat SET text = ".$cat." WHERE text = ".$old_cat);
       }
       else {
          $_SESSION['erreur'] = "Catégorie déjà existante";
       }
       print_r($_SESSION);
    }
    C'est bien différent d'avant mais j'ai toujours le même problème: l'édition dans la table est bien faite, mais la session erreur est bien initialisée... (et c'est bien ici d'après les print_r()...

    Gné
    Je vois pas d'où ça vient

Discussions similaires

  1. [Système] PHP5 : exécuter un fichier .exe
    Par koueletbak dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2006, 10h55
  2. Réponses: 7
    Dernier message: 30/03/2006, 16h43
  3. Réponses: 5
    Dernier message: 29/11/2005, 18h35
  4. [Système] PHP & exécution d'un commande sur Linux
    Par carlos20 dans le forum Langage
    Réponses: 8
    Dernier message: 12/11/2005, 13h26
  5. [Système] Pb exécution d'une commande externe
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 19/10/2005, 17h34

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