Undefined variable

Résolu
Bonjour,
j'ai dans page php une partie "message du nombre d'enregistrement dans la BD"
j'ai initialisé les compteurs comme ça
$nb_insert=0;
$nb_update=0;
$nb_delete=0;
après j'ai faisais la partie d'insertion , Update et suppression
et puis
j'ai mis cette portion de code
$msg_enr_modifs='<font color="green">';
if($$nb_insert>0) $msg_enr_modifs.=$nb_insert." ajout de lignes de valeurs<br />";
if($nb_update>0) $msg_enr_modifs.=$nb_update." lignes de valeurs modifiées<br />";
if($nb_delete>0) $msg_enr_modifs.=$nb_delete." lignes de valeurs suprimées<br />";
$msg_enr_modifs.='</font>';
il m'affiche comme erreur
que les 3 compteurs sont Undefined variables
et après je utiliser l'id user pour chercher des enregistrements
alors j'ai pensé à la récupération de l'id
la ligne est :
$Id_user=$_SESSION['Id_user'];
de même il m'afficher "Undefined variables, Id_user" quelqu'un peux voir ou se trouve l'erreur svp , merci

29 réponses

Résumé de la discussion

Des compteurs d'insertion, de modification et de suppression affichent une erreur Undefined variable, tandis que la récupération de l'identifiant utilisateur via la session est également signalée comme indéfinie. Les solutions discutées incluent l'utilisation de variables globales ou l'accès via $GLOBALS pour rendre ces compteurs visibles dans toutes les portions du script, et vérifier la présence des valeurs avant utilisation. D'autres répondent que les compteurs ne sont initialisés que dans une condition postée, ce qui les rend indisponibles ailleurs, et préconisent de les déclarer ou de les initialiser dès le début. Concernant l'identifiant Id_user, une mise en garde rappelle d'assurer la présence de la valeur dans la session et d'éviter des accès hors contexte afin d'éviter d'autres Undefined variables.

Bobot (l’IA à votre service)
  1. d'accord je te remercie infiniment et bonne journée
    1. Contributeur
      Je t'en pris ; je te passe en résolu
  2. merci infiniment , c'est bon j'ai éliminé l'd_valeur et c'est bon il enregistre le valeurs par contre il me reste un petit souci dans mes 2 table (scenario et valeurs ) comme dans chaqu'une de table j'ai la clé primaire de même table et l'id primaire de l'autre
    mon problème c'est que l'incrémentation automatique ça marche normale pour chaque table mais pour le 2 clés étrangères toujours 0:
    exp : dans la table secario j'ai , id_scenario (l'incrémentation automatique ça marche) et pour l'id_valeur dans la table scenario comme clé étrangée toujours à 0, j'ai fais quoi pour que l'incrémentation ça marche pour toutes les clés ?
    1. Contributeur
      Une clé primaire s'incrémente, pas une clé étrangère.
      Une clé étrangère veut simplement dire que la colonne en question ne peut prendre qu'une des valeur de l'ID de l'autre table. C'est à toi d'insérer les valeurs manuellement.
  3. aucune erreur
    même qd je faisais echo $sql; il m'a affciher dans la page web ça:
    insert into valeurs_a_saisir(id_valeur,cof_eau_du_sol, niv_de_debordement, taux_concentration, pour_etanchite, niv_depart, sal_sol, but, choix_sortie, origine_iragation, sal_eau_entre, condition_climatique, annee, id_scenario) values ("5.16932", "100", "5546", "6565", "10", "1", "1", "1", "Fleuve", "failbe", "moyenne", "", "0"), je comprend pas pourquoi il ne l'enregistre pas dans la BD
    1. Contributeur
      Il manque une valeur vide pour l'ID non ?
  4. c'est bon pour l'erreur merci , par contre comme tu as vu j'ai 2 insert
    une dans la table secnario et pour la table valeurs à saisir ,
    qd j'ai rempli le tableau de valeur et après j'ai regardé ma base de donnée j'ai remarqué que pour la table scenario les champs sont pleins par contre l'autre table elle est toujours vide j'ai essayé de faire echo il m'a affiché dans la page web les valeurs que j'ai déjà inséré je sais pas d'ou vient l'erreur ??
    voilà la 2 emme insert
    //recup de l'ID
    $id_scenario= mysql_insert_id();
    $sql='insert into valeurs_a_saisir(id_valeur,cof_eau_du_sol, niv_de_debordement, taux_concentration, pour_etanchite, niv_depart, sal_sol, but, choix_sortie, origine_iragation, sal_eau_entre, condition_climatique, annee, id_scenario) values ("'.$cof_eau_du_sol.'", "'.$niv_de_debordement.'", "'.$taux_concentration.'", "'.$pour_etanchite.'", "'.$niv_depart.'", "'.$sal_sol.'", "'.$but.'", "'.$choix_sortie.'", "'.$origine_iragation.'", "'.$sal_eau_entre.'", "'.$condition_climatique.'", "'.$annee.'", "'.$id_scenario.'")';
    echo $sql;
    $requete = $db->query($sql) ;
    1. Contributeur
      Aucune erreur ?
  5. Contributeur
    $sql_1="INSERT INTO scenario (id_scenario,Id_user,titre,commentaire) VALUES('','".$_SESSION['Id_user']."','".$titre."','".$commentaire."')"; 


    Même problème que tout à l'heure : soit tu as oublié le session_start() ; soit ta session n'existe pas, ce en cas il faut gérer le cas.

    $userId = (isset($_SESSION['Id_user'])) ? $_SESSION['Id_user'] : "";
    
    $sql_1="INSERT INTO scenario (id_scenario,Id_user,titre,commentaire) VALUES('','".$userId."','".$titre."','".$commentaire."')"; 
    1. est qu' il y a quelqu'un pour m'aider de corriger mon code svp
      1. Contributeur
        Pourquoi ton "values" commence par une virgule ?
    2. oui il y a pas de problème de majuscule et de minuscule dans les tables et la partie php
      1. de plus il prends pas les autres inserts juste de la 1 ère :
        $sql_1="INSERT INTO scenario (id_scenario,Id_user,titre,commentaire) VALUES('','".$_SESSION['Id_user']."','".$titre."','".$commentaire."')";
        et l'enregistre pas dans la BD
        1. je te donne le code de la 2 émme page :
          <?php

          require_once('dbconnect.php');

          ?>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
          <link href="styles.css" rel="stylesheet" type="text/css">
          </head>
          <body>
          <p align="center" class="titre"><strong>- : : : Veuillez remplir ce tableau : : : -</strong></p>
          <?php

          //On verifie que le formulaire a été envoye
          if(isset($_POST['enregistrer']))
          {
          // on récupère les valeurs qui ont poster

          $cof_eau_du_sol = $_POST['cof_eau_du_sol'];
          $niv_de_debordement = $_POST['niv_de_debordement'];
          $taux_concentration = $_POST['taux_concentration'];
          $pour_etanchite = $_POST['pour_etanchite'];
          $niv_depart = $_POST['niv_depart'];

          $sal_sol = $_POST['sal_sol'];
          $but = $_POST['but'];
          $choix_sortie = $_POST['choix_sortie'];
          $origine_iragation = $_POST['origine_iragation'];
          $sal_eau_entre = $_POST['sal_eau_entre'];
          $condition_climatique = $_POST['condition_climatique'];
          $annee = $_POST['annee'];
          //$arrayMois = $_POST['Mois'];
          $titre=$_POST['titre'];
          $commentaire=$_POST['commentaire'];
          //on enregistre d'abord dans la table scenario
          $sql_1="INSERT INTO scenario (id_scenario,Id_user,titre,commentaire) VALUES('','".$_SESSION['Id_user']."','".$titre."','".$commentaire."')";
          echo $sql_1; // ici je faisais echo pour voir quoi il m'affiche
          $requete1 = $db->query($sql_1) ;
          //recup de l'ID
          $id_scenario= mysql_insert_id();
          $sql='insert into valeurs_a_saisir(id_valeur,cof_eau_du_sol, niv_de_debordement, taux_concentration, pour_etanchite, niv_depart, sal_sol, but, choix_sortie, origine_iragation, sal_eau_entre, condition_climatique, annee, id_scenario) values ("'.$cof_eau_du_sol.'", "'.$niv_de_debordement.'", "'.$taux_concentration.'", "'.$pour_etanchite.'", "'.$niv_depart.'", "'.$sal_sol.'", "'.$but.'", "'.$choix_sortie.'", "'.$origine_iragation.'", "'.$sal_eau_entre.'", "'.$condition_climatique.'", "'.$annee.'", "'.$id_scenario.'")';
          $requete = $db->query($sql) ;//or die( mysql_error() );

          }
          ?>
          1. merci Mihawk c'est bon il m'affiche plus l'erreur de Undfined index il m'a afficher le tableau de valeur normal et qd j'ai inséré mes valeurs et j'ai cliqué sur enregistré il m'a afficher un autre erreur "Notice: Undefined index: Id_user in C:"
            et cet erreur vient de cette ligne de code dans ma deuxièmme page .
            //on enregistre d'abord dans la table scenario
            $sql_1="INSERT INTO scenario (id_scenario,Id_user,titre,commentaire) VALUES('','".$_SESSION['user']."','".$titre."','".$commentaire."')";
            echo $sql_1;
            pouratnt dans mes 2 table ( User et scenario) sql j'en ai l'id_user
            1. Contributeur
              Tu respectes bien les majuscules / minuscules dans les noms de champ de ta table ?
            2. Mihawk : tu es tjrs là ??
              j'attends tjrs ton aide pour corriger mon code
          2. en fait pour la page head il juste session_start();
            et j'ai la page accueil dans la quelle si un user est connecté j'affiche tous les pages que lui concerne du coup j'ai utilisé
            <?php
            // si l'utilisateur est connecté comme simple utilisateur ...
            if($_SESSION['privilege'] == "user") { // Affichage conditionnel : si et seulement si l'utilisateur est connecté avec le privilege utilisateur simple ?>
            <strong><u>En tant qu'utilisateur simple vous ne pouvez pas effectuer d'actions</u></strong>
            <?php }
            1. Contributeur
              Il faut gérer le cas où tu n'as pas de Id_User :

              ///// ---------------------
              ////----- Partie recherche des scenari pour cet utilisateur --------
              
              $Id_user = (isset($_SESSION['Id_user'])) ? $_SESSION['Id_user'] : null;
              
              //recup du choix eventuel dans la liste déroulante scénario
              if ($Id_user != null){
                 if(isset($_POST['liste_scenario'])){
                    $scenario=$_POST['liste_scenario'];
                 } else {
                    $scenario="";
                 }
              
                 $sql="SELECT * FROM scenario WHERE Id_user='".$Id_user."' ";
                 //echo "<br />".$sql;
                 $requete = $db->query($sql);
                 //comptage du nb de scénario trouvé pour cet utilisateur
                 $row_cnt = mysqli_num_rows($requete);
                 if($row_cnt>0){
              

              1. Mihawk: il m'affiche Undefined index:
                ThEBiShOp : pour la sussion_start() j'ai inclue une page head dans la quelle il y la sussion_start()
                1. Contributeur
                  et tu mets quelque chose dans $_SESSION['Id_user'] un moment donné dans tes pages ?
              2. Merci Mihawk, merci ThEBiShOp je faisais comme tu m'as dit Mihawk là c'est bon pour les compteurs mais pour l'id_user tjrs il es undifined
                //recup id_utilisateur dans la variable de session
                $Id_user=$_SESSION['Id_user'];// ici l'erreur
                1. Contributeur
                  C'est un "Undefined variable" ou un "Undefined index" ce coup-là ?
                2. Contributeur
                  $_SESSION['Id_user'] sort de nulle part, c'est normal
                  il te faut un session_start(); au début de ton code de préférence, et il faut que tu instancies cette variable quelque part dans ton code, sinon ça ne va pas marcher
              3. j'ai éliminé la partie if (isset($_POST['enr_modifs']))
                il m'a afficher que tous mes variables son Undifined non seulement les 3 compteurs
                1. Contributeur
                  Déplace l'initialisation des compteurs au début du code :

                  <?php
                  
                  $msg_enr_modifs=""; 
                  
                  //init compteurs
                  $nb_insert=0;
                  $nb_update=0;
                  $nb_delete=0; 

                  1. Contributeur
                    oui, mieux ^^
                    mais je pense que si tu ne fais pas ton traitement, il ne devrait pas y avoir d'inscription en base, si ?
                2. alors j'élimine la if (isset($_POST['enr_modifs'])) ????
                  1. Contributeur
                    bah si t'estimes que t'en as pas besoin, peut être...
                3. voilà le code sans Global
                  <?php

                  require_once('dbconnect.php');

                  ?>
                  <?php

                  $msg_enr_modifs="";

                  //// -- partie enregistrement des modifs scénario ----
                  if(isset($_POST['enr_modifs'])){
                  //le bouton enr modifs a été cliqué
                  $cof_eau_du_sol = $_POST['cof_eau_du_sol'];
                  $niv_de_debordement = $_POST['niv_de_debordement'];
                  $taux_concentration = $_POST['taux_concentration'];
                  $pour_etanchite = $_POST['pour_etanchite'];
                  $niv_depart = $_POST['niv_depart'];
                  $sal_sol = $_POST['sal_sol'];
                  $but = $_POST['but'];
                  $choix_sortie = $_POST['choix_sortie'];
                  $origine_iragation = $_POST['origine_iragation'];
                  $sal_eau_entre = $_POST['sal_eau_entre'];
                  $condition_climatique = $_POST['condition_climatique'];
                  $annee = $_POST['annee'];
                  //$Mois = $_POST['Mois'];
                  $titre=$_POST['titre'];
                  $commentaire=$_POST['commentaire'];

                  //on UPDATE d'abord dans la table scenario les modifs éventuelles de titre et commentaire
                  $sql_1="UPDATE scenario SET titre='".$titre."',commentaire='".$commentaire."' WHERE id_scenario='".$id_scenario."'";
                  $requete1 = $db->query($sql_1) ;

                  //puis Update ou insert ou Delete dans table valeurs
                  //init compteurs
                  $nb_insert=0;
                  $nb_update=0;
                  $nb_delete=0;
                  // 3 cas: ajout, modif, supression
                  if(empty($cof_eau_du_sol) && empty($niv_de_debordement) && empty($taux_concentration)&& empty($pour_etanchite)&& empty($niv_depart)
                  && empty($sal_sol)&& empty($but)&& empty($choix_sortie)&& empty($origine_iragation)&& empty($sal_eau_entre)&& empty($condition_climatique)){
                  //les champs ne sont pas vides mais étaient vides avant, c'est un ajout donc INSERT
                  $sql='insert into valeurs_a_saisir(Id_valeur,cof_eau_du_sol, niv_de_debordement, taux_concentration, pour_etanchite, niv_depart, sal_sol, but, choix_sortie, origine_iragation, sal_eau_entre, condition_climatique, annee, Mois,id_scenario) values ("'.$cof_eau_du_sol.'", "'.$niv_de_debordement.'", "'.$taux_concentration.'", "'.$pour_etanchite.'", "'.$niv_depart.'", "'.$sal_sol.'", "'.$arraybut[$mois].'", "'.$choix_sortie.'", "'.$origine_iragation.'", "'.$sal_eau_entre.'", "'.$condition_climatique.'", "'.$annee.'", "'.$Mois.'","'.$id_scenario.'")';
                  $requete = $db->query($sql) ;//or die( mysql_error() );

                  }
                  echo "<br />".$sql;
                  $requete = $db->query($sql) ;
                  $nb_insert++;

                  //}

                  //un ou les champs ont eté modifiés, donc UPDATE
                  $sql="UPDATE valeurs SET cof_eau_du_sol='".$cof_eau_du_sol."', niv_de_debordement='".$niv_de_debordement."' taux_concentration='".$taux_concentration."'pour_etanchite='".$pour_etanchite."'niv_depart='".$niv_depart."'sal_sol='".$sal_sol."'but='".$arraybut[$mois]."'choix_sortie='".$choix_sortie."'origine_iragation='".$origine_iragation."'sal_eau_entre='".$sal_eau_entre."'condition_climatique='".$condition_climatique."'annee='".$annee."' WHERE id_scenario ='".$id_scenario."' AND mois='".$mois."'";
                  echo "<br />".$sql;
                  $requete = $db->query($sql) ;
                  $nb_update++;
                  if(empty($cof_eau_du_sol) && empty($niv_de_debordement) && empty($taux_concentration)&& empty($pour_etanchite)&& empty($niv_depart)
                  && empty($sal_sol)&& empty($but)&& empty($choix_sortie)&& empty($origine_iragation)&& empty($sal_eau_entre)&& empty($condition_climatique)){
                  //les champs sont vides mais n'étaient pas vides avant, c'est une suppression de valeurs donc DELETE
                  $sql="DELETE FROM valeurs_a_saisir WHERE id_scenario ='".$id_scenario."'";
                  echo "<br />".$sql;
                  $requete = $db->query($sql) ;
                  $nb_delete++;

                  }
                  }
                  //message du nombre d'enr dans la BDD
                  $msg_enr_modifs='<font color="green">';
                  if($nb_insert>0) $msg_enr_modifs.=$nb_insert." ajout de lignes de valeurs<br />";
                  if($nb_update>0) $msg_enr_modifs.=$nb_update." lignes de valeurs modifiées<br />";
                  if($nb_delete>0) $msg_enr_modifs.=$nb_delete." lignes de valeurs suprimées<br />";
                  $msg_enr_modifs.='</font>';
                  // c'est ici qu'il m'affiche l'erreur

                  ///// ---------------------
                  ////----- Partie recherche des scenari pour cet utilisateur --------
                  //recup id_utilisateur dans la variable de session
                  $Id_user=$_SESSION['Id_user'];// ici même erreur
                  //recup du choix eventuel dans la liste déroulante scénario
                  if(isset($_POST['liste_scenario'])){

                  $scenario=$_POST['liste_scenario'];
                  }else{
                  $scenario="";
                  }

                  $sql="SELECT * FROM scenario WHERE Id_user='".$Id_user."' ";
                  //echo "<br />".$sql;
                  $requete = $db->query($sql);
                  //comptage du nb de scénario trouvé pour cet utilisateur
                  $row_cnt = mysqli_num_rows($requete);
                  if($row_cnt>0){

                  //si il y un ou des scénario, on affiche la page avec la liste déroulante
                  ?>
                  1. Contributeur
                    tes variables sont déclarées dans :
                    if (isset($_POST['enr_modifs'])) {

                    si tu ne rentres pas là dedans, tes variables seront undefined.
                4. dans le 2 cas avec ou bien sans global il m'affiche toujours le même erreur , vous savez pas d'ou vient cet erreur :((((((
                  1. Contributeur
                    remontre ton code sans les globals.
                  2. Contributeur
                    Fais pas une fixette là-dessus, ça change rien
                • 1
                • 2