Variable indéfini alors qu'elle est.

Résolu
Bonjour,

je fais appel à nouveau à vous car, j'ai un souci avec ce code :

function generer_mot_de_passe($nb_caractere = 12) 
{
        $mot_de_passe = "";
        
        $chaine = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $longeur_chaine = strlen($chaine);
        
        for($i = 1; $i <= $nb_caractere; $i++)
        {
            $place_aleatoire = mt_rand(0,($longeur_chaine-1));
            $mot_de_passe .= $chaine[$place_aleatoire];
        }

        return $mot_de_passe;    
}
echo "Bravo, vous pouvez passer à l'étape suivante en donnant ce code <mark>$mot_de_passe</mark> à Messi44 par MP sur SDF."; 
}
else
{
echo "Vous n'avez pas encore atteint la note minimum de 18/20.";
}
?>


Il me dis que la variable "$mot_de_passe" n'est pas définie alors qu'elle est.

Je veux que dans l'echo, il me donne la chaîne de caractère généré aléatoirement.

Vous pouvez m'aider s'ils vous plait ?

Merci par avance.

10 réponses

Résumé de la discussion

Une fonction PHP est utilisée pour générer un mot de passe aléatoire, mais l'affichage échoue lorsque l'on tente d'inclure la variable générée directement dans un echo en dehors de la fonction. La solution principale consiste à faire retourner la valeur par la fonction et à l'utiliser ensuite dans l'echo, ou à appeler la fonction directement dans le texte affiché. Des conseils complémentaires évoquent aussi de passer le nombre de caractères en argument, d'éviter l accès direct à une variable locale et de corriger des détails de syntaxe. Certains répondants évoquent l'enregistrement du mot de passe généré en base de données via PDO, avec des précautions de sécurité et une gestion correcte des requêtes.

Bobot (l’IA à votre service)
  1. Bonjour

    En effet, $mot_de_passe est bien défini à l'intérieur de ta fonction, mais pas à l'extérieur.
    Donc dans
    echo "Bravo, vous pouvez passer à l'étape suivante en donnant ce code <mark>$mot_de_passe</mark> à Messi44 par MP sur SDF."; 
    il n'est pas défini

    Ça devrait mieux marcher :
    echo "Bravo, vous pouvez passer à l'étape suivante en donnant ce code <mark>",generer_mot_de_passe(),"</mark> à Messi44 par MP sur SDF."; 
    
    1
    1. Ton soucis vient du fait que dans la ligne pour afficher le résultat de la fonction (
      echo "Bravo, vous pouvez passer à l'étape suivante en donnant ce code <mark>$mot_de_passe</mark> à Messi44 par MP sur SDF."; 
      )
      Tu utilise directement la variable, alors qu'il faut mettre le nom de la fonction :

      echo 'Bravo, vous pouvez passer à l'étape suivante en donnant ce code <mark>'.generer_mot_de_passe.(12)'</mark> à Messi44 par MP sur SDF.'; 

      Il faut aussi enlever le
      = 12 
      lors de la déclaration de fonction.
      Ton code final ressemble donc à ça :

      function generer_mot_de_passe($nb_caractere) 
      {
              $mot_de_passe = "";
              
              $chaine = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
              $longeur_chaine = strlen($chaine);
              
              for($i = 1; $i <= $nb_caractere; $i++)
              {
                  $place_aleatoire = mt_rand(0,($longeur_chaine-1));
                  $mot_de_passe .= $chaine[$place_aleatoire];
              }
      
              return $mot_de_passe;    
      }
      echo 'Bravo, vous pouvez passer à l'étape suivante en donnant ce code <mark>'.generer_mot_de_passe(12).'</mark> à Messi44 par MP sur SDF.'; 
      }
      else
      {
      echo "Vous n'avez pas encore atteint la note minimum de 18/20.";
      }
      ?>
      
      1
      1. Voila le message d'erreur :

        Notice: Undefined variable: mot_de_passe in C:\wamp\www\FC-LUCRYIO\index2.php on line 348

        la ligne est correspond à celle de l'"echo".

        Je viens de vérifier (au cas ou) et cette variable est utilisé seulement pour ça et nulle part ailleur.
        0
        1. J'ai corrigé ma réponse et tete0148 a répondu en même temps
          0
        2. Juste une question : pourquoi n'ai-je pas la coloration syntaxique sur les codes de mes messages.
          0
        3. pour avoir la couleur sur ton code, tu doit choisir quel langage tu utilise ^^
          0
        4. Merci ^^
          0
      2. Merci, ça fonctionne très bien.

        Une autre petite question :

        Comment faire pour que la chaîne de caractère donne un mot et non un truc qui veux rien dire ?

        Ou alors, est-ce possible que ces mots soit gardé dans un fichier texte ? (c'est pour vérifier la véracité des mots que les gens devrons me donner pour valider leurs quizz)
        0
        1. soit tu choisi le mot à la base, ou tu fait une liste de mots.
          Si tu veux que le mot soit aléatoire, il va falloir utiliser une API de google, celle de Google traduction je pense (je sais même pas si elle existe).
          Je te conseil la méthode de la liste, puis de choisir un des mots aléatoirement.
          0
      3. Si par "mot" tu entends "mot du dictionnaire de la langue française", le seul moyen à ma connaissance est d'avoir une grande liste de mots et de "taper dedans" au hasard
        0
        1. et c'est possible de transférer ces mots aléatoire dans un fichier texte ? si oui, comment faire à partir de mon code ?
          0
          1. Je n'ai pas bien compris, mettre la liste dans un fichier ?
            0
          2. non, je vais essayer d'être plus explicite.

            Actuellement le programme génère un "mot" aléatoire.
            Ce que j'aimerais savoir c'est est-ce que c'est "mot" peuvent être mis en même temps que la génération du "mot" dans un fichier texte.

            J'aimerais garder une trace des "mot" généré afin de vérifier ce que les membres me donnerons et voir s'il ne triche pas en quelque sorte.
            0
          3. La meilleur solution serait de les stocker en base de donnée. En as tu une avec ton hébergeur ?
            0
          4. oui, j'ai une base de données avec mon hebergeur, et comment adapter mon code pour qu'il enregistre dans la base ?

            Je viens de créer ma base "fc_lucryio" et ma table "code_quizz" qui contien : id et code.
            0
          5. Je vais te montrer le code. Juste un peu de temps.

            Dans le code au dessus j'ai oublier quelque chose
             echo 'Bravo, vous pouvez passer à l\'étape suivante en donnant ce code <mark>'.generer_mot_de_passe(12).'</mark> à Messi44 par MP sur SDF.'; 

            Il faut penser à échapper l'apostrophe à "l'étape" en utilisant un anti slash
            0
        2. oui oui seulement id est en auto-incrément.

          voici le code :

          function generer_mot_de_passe($nb_caractere) 
          {
                  $mot_de_passe = "";
                  
                  $chaine = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                  $longeur_chaine = strlen($chaine);
                  
                  for($i = 1; $i <= $nb_caractere; $i++)
                  {
                      $place_aleatoire = mt_rand(0,($longeur_chaine-1));
                      $mot_de_passe .= $chaine[$place_aleatoire];
                  }
            $HOTE = 'localhost'; //NOM DE L'HÔTE SQL (fourni par ton hébergeur)
            $DB = 'fc_lucryio'; //NOM DE TA BASE DE DONNEES (que tu dois crée ou pas selon ton hébergeur)
            $USERNAME = 'root'; //NOM D' UTILISATEUR FOURNI PAR TON HEBERGEUR
            $PWD = ''; //MOT DE PASSE SQL FOURNI PAR TON HEBERGEUR
            
            //********************************//
            // Il faut que tu modifie les     //
            // ci dessus                      //
            //********************************//
            
            try {
             $bdd = new PDO('mysql:host='.$HOTE.';dbname='.$DB.'',$USERNAME,$PWD); 
             }
            catch (Exception $e){
             die ('Erreur: ' . $e->getMessage());
            } // NOUS VOILA CONNECTER A LA BASE DE DONNEE (NORMALEMENT)
            
            /* Il faudra créer une table dans votre base de donnée, elle s'appelera MDPgeneres
            il y aure dedans les champs :
            ID , de type INT avec une limite de caracteres de 11
            MDP de type char avec une limite de 255
            */
            $bdd->exec('INSERT INTO MDPgeneres (mdp)
               VALUES('.NULL,$mot_de_passe.')');
               
                  return $mot_de_passe;    
          }
          echo 'Bravo, vous pouvez passer à l\'étape suivante en donnant ce code <mark>'.generer_mot_de_passe(12).'</mark> à Messi44 par MP sur SDF.'; 
          


          Et voici l'erreur qu'il me met :

          Warning: PDO::exec() expects exactly 1 parameter, 2 given in C:\wamp\www\FC-LUCRYIO\index2.php on line 367

          ce qui correspond à cette ligne :

          VALUES('.NULL,$mot_de_passe.')');

          Et même si je retire le "NULL" et les ".", ça ne fonctionne pas, le code ne s'enregistre pas dans la base de données.

          J'ai bien fait la base, "fc_lucryio" et la table "mdpgeneres" et les 2 colonnes :

          - id int(11) auto-incrémentation
          - mdp char(255)

          voila tous ce que j'ai fais.

          Et malgré tous ça, le code se génére le message d'erreur est là et le code ne s'enregistre pas dans la base, une idée de quelqu'un ?
          0
          1. Il faut changer les identifiants ainsi que le nom de l'hôte SQL
            $HOTE = 'localhost'; //NOM DE L'HÔTE SQL (fourni par ton hébergeur)
              $DB = 'fc_lucryio'; //NOM DE TA BASE DE DONNEES (que tu dois crée ou pas selon ton hébergeur)
              $USERNAME = 'root'; //NOM D' UTILISATEUR FOURNI PAR TON HEBERGEUR
              $PWD = ''; //MOT DE PASSE SQL FOURNI PAR TON HEBERGEUR

            Penser à enlever le point devant NULL et MDPgeneres pour la table.
            0
            1. pour le moment, je suis en local donc pour l'hôte, c'est ça ^^

              pour le nom de la table, si je met MDPgeneres, ça me le change en mdpgeneres

              il me retire les majuscules.

              Pour le "." devant NULL, quand je le retire ça me fait cette erreur :

              Parse error: syntax error, unexpected 'NULL' (T_STRING) in C:\wamp\www\FC-LUCRYIO\index2.php on line 367
              0
              1. En faisant comme ça :

                function generer_mot_de_passe($nb_caractere) 
                {
                        $mot_de_passe = "";
                        
                        $chaine = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                        $longeur_chaine = strlen($chaine);
                        
                        for($i = 1; $i <= $nb_caractere; $i++)
                        {
                            $place_aleatoire = mt_rand(0,($longeur_chaine-1));
                            $mot_de_passe .= $chaine[$place_aleatoire];
                        }
                  $HOTE = 'localhost'; //NOM DE L'HÔTE SQL (fourni par ton hébergeur)
                  $DB = 'fc_lucryio'; //NOM DE TA BASE DE DONNEES (que tu dois crée ou pas selon ton hébergeur)
                  $USERNAME = 'root'; //NOM D' UTILISATEUR FOURNI PAR TON HEBERGEUR
                  $PWD = ''; //MOT DE PASSE SQL FOURNI PAR TON HEBERGEUR
                  
                  //********************************//
                  // Il faut que tu modifie les     //
                  // ci dessus                      //
                  //********************************//
                  
                  try {
                   $bdd = new PDO('mysql:host='.$HOTE.';dbname='.$DB.'',$USERNAME,$PWD); 
                   }
                  catch (Exception $e){
                   die ('Erreur: ' . $e->getMessage());
                  } // NOUS VOILA CONNECTER A LA BASE DE DONNEE (NORMALEMENT)
                  
                  /* Il faudra créer une table dans votre base de donnée, elle s'appelera MDPgeneres
                  il y aure dedans les champs :
                  ID , de type INT avec une limite de caracteres de 11
                  MDP de type char avec une limite de 255
                  */
                  $bdd->exec('INSERT INTO mdpgeneres (MDP)
                     VALUES('.$mot_de_passe.')');
                     
                        return $mot_de_passe;    
                }
                echo 'Bravo, vous pouvez passer à l\'étape suivante en donnant ce code <mark>'.generer_mot_de_passe(12).'</mark> à Messi44 par MP sur SDF.'; 
                
                }
                else
                {
                echo "Vous n'avez pas encore atteint la note minimum de 18/20.";
                }
                ?>


                J'ai plus d'erreur mais le code ne s'enregistre pas dans ma base de données.

                une idée ?
                0
                1. Il faut effectivement laisser le point (pour la concaténation).
                  Mais je ne sais pas pourquoi ça ne s'inclue pas. C'était pareil à mes débuts.
                  0
                2. j'ai essayé comme ça :

                  $bdd->exec('INSERT INTO mdpgeneres 
                       VALUES("", "'.$mot_de_passe['MDP'].'")');


                  j'ai cette erreur :

                  Warning: Illegal string offset 'MDP' in C:\wamp\www\FC-LUCRYIO\index2.php on line 367

                  qui correspond à cette ligne :
                  VALUES("", "'.$mot_de_passe['MDP'].'")');


                  et ça me m'enregistre 1 lettre ou 1 chiffre uniquement dans la base.

                  une idée ?

                  PS : Il m'enregistre seulement le premier caractère généré.
                  0
                3. Je vois.
                  J'ai peut-être une idée :
                  /*** Au dessus il y a la fonction 
                  **************************************/
                  $MDPgenere = generer_mot_de_passe(12);
                  $[/contents/104-bases-de-donnees-introduction bdd]->exec('INSERT INTO mdpgeneres 
                       VALUES('.MDPgenere.')');
                  
                  0
                4. heu, je met ce code ou en faite ?
                  0
                5. Tu enlève tout le code concernant la base de donnée qui est à l'intérieur de la fonction.
                  Et tu met dessous, avec ce que je viens de rajouter.
                  0