Problème insertion membres dans la bdd

Signaler
Messages postés
73
Date d'inscription
mardi 2 janvier 2018
Statut
Membre
Dernière intervention
4 décembre 2019
-
jordane45
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
-
Bonjour,
J'ai crée ma page inscription.php, mais le problème est que rien ne s’inscrit dans ma base de donnée j'ai bien regarder mon code mais je ne trouve pas ou est ma faute pouvez-vous m'aider svp.

Cordialement

code php

<?php
try{
$bdd = new PDO('mysql:host:127.0.0.1:dbname=espace_membre,charset=utf-8','root','');
}
catch(Exeption $e)
{
    die('Erreur :' .$e->getMessage());
}
    if (isset($_POST['envoyer']))
    {
        if (!empty($_POST['pseudo']))
        {
            if (!empty($_POST['pass']))
             {
               $pseudo = htmlspecialchars($_POST['pseudo']);
                $pass = sha1($_POST['pass']);

                $pseudolength = strlen($pseudo);
                /* on compte le nombre de caractére */
                   if($pseudolength <= 255) 
                   {        /* on insert les donnée dans la base de donée*/
                       /*
                       $insertmbr = $bdd -> prepare('INSERT INTO membres(pseudo, mot_de_passe) VALUES (?,?)');
                            $insertmbr -> execute(array($pseudo, $pass));
                            $erreur2 = "Votre compte a bien été crée.";
                       */
                       $insermbr = $bdd->prepare("INSERT INTO membres(pseudo, mot_de_passe) VALUES (?,?)");
									$insermbr->execute(array($pseudo, $pass));	
									
									
                            
                   if(isset($_SESSION))
                       {
                           $erreur2 = "Votre compte a bien été crée.";
                       }
                       else
                       {
                        $erreur = "Votre compte na pas été crée";
                            
                       }
;                   } 
                   else {
                       $erreur = 'Votre pseudo ne doit pas dépasser 255 carractére!';
                   }
            }
            else 
            {
                $erreur = 'le champ "mot de passe" est vide!';
            }
        }
        else
        {
            $erreur = 'Le champ "pseudo" est vide!';
        }
    }

?>
<!DOCTYPE html>
    <html>
        <head>
            <title>Formulaire</title>
            <meta charset="UTF8" />
        </head>
        <body>
            <div style="text-align:center;" >
                <h2>Inscription</h2>
                <form method="POST" action="" style="text-align: center;">
                    <table style= "margin:auto;">
                        <tr style="text-align: center;">
                            <td>
                                <label>pseudo:</label>
                            </td>
                            <td>
                                <input type="text" placeholder="pseudo" name="pseudo" style="text-align: center;">
                            </td> 
                        </tr>
                            <tr>
                                <td>
                                    <label>Votre mot de passe</label>
                                </td>
                                <td style="text-align: center;"> 
                                    <input type="password" placeholder="Votre mote de passe" name="pass" style="text-align: center;">
                                </td>
                            </tr>
                            <tr>
                                <td>
                                    <td>
                                <input type="submit" value="Je m'incris" name="envoyer" />
                                </td>
                                <tr>
                                <td>
                                    <td>
                                    <?php
                                        if (isset($erreur)) 
                                        {
                                            echo '<font color= "red">'.$erreur."</font>";
                                            
                                        }
                                        else if(isset($erreur2))
                                                {
                                            echo '<font color= "green">'.$erreur2."</font>";
                                            
                                        }
                                            
                                ?>
                                </td>
                                </td>
                            </tr>
                            </td>
                            </tr>
                           
                    </table>
                </form>
            </div>

        </body>
    </html>


voici ma base de donnée:



Configuration: Windows / Chrome 78.0.3904.108

20 réponses

Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
1934
Bonjour,

Avant toutes choses, commence par gérer les éventuelles erreurs PDO.
Pour cela, lit et applique le contenu de ce lien : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
=> activer les erreurs dans la connexion PDO
=> Placer CHAQUE requête dans un bloc try/catch

Ensuite, mets en pratiques les consignes données ici :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
=> Activer les erreurs PHP
=> Récupérer proprement les variables AVANT de les utiliser

Sache également qu'on n'utilise plus le SHA1 pour gérer les mots de passe ( pas assez sécurisé ) mais qu'à la place on utilise : https://www.php.net/manual/fr/function.password-hash.php

Tu peux également, au début de ton script, placer un
print_r($_POST);

histoire de voir ce que renvoi ton formulaire...

Reviens nous avec ton code modifié si ton souci persiste.

jordane45
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
1934
Ah.. et je vois que tu cherches à utiliser les variables de SESSION....
mais je ne vois nul part dans ton code (ça devrait se trouver au tout début de celui-ci...) le démarrage des sessions...
Je ne vois pas non plus à quel endroit tu stockes une valeur dedans...
Un oublie dans ton copier/coller ??
Messages postés
73
Date d'inscription
mardi 2 janvier 2018
Statut
Membre
Dernière intervention
4 décembre 2019

bonjour
bon j'ai modifié le code comme tu ma demandé, mise à part le hachage du mot de passe qui n'est pas pour le moment mon plus grand problème(je le ferai plus tard).
Quand j'actualise le code ça me dis ceci.

Erreur ! SQLSTATE[HY093]: Invalid parameter number: parameter was not defined Les datas : PDO Object ( )

ps J'ai suivi le tuto de Prim FX mais il ne doit plus être à jour.

<?php
try{
$bdd = new PDO('mysql:host:127.0.0.1:dbname=espace_membre,charset=utf-8','root',''); 
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

}
catch(Exeption $e)
{
    die('Erreur :' .$e->getMessage());
}
    if (isset($_POST['envoyer']))
    {
        if (!empty($_POST['pseudo']))
        {
            if (!empty($_POST['pass']))
             {
               $pseudo = htmlspecialchars($_POST['pseudo']);
                $pass = sha1($_POST['pass']);
                

                $pseudolength = strlen($pseudo);
                /* on compte le nombre de caractére */
                   if($pseudolength <= 255) 
                   {        /* on insert les donnée dans la base de donée*/
                       
                      try
                   {
                       $insermbr = $bdd->prepare("INSERT INTO membres(pseudo, mot_de_passe) VALUES (:pseudo,:mot_de_passe)");
         $insermbr->execute(array(
                                        'pseudo' => $pseudo,
                                        'pass' =>  $pass )); 
                   }catch(Exception $e){
                    // en cas d'erreur :
                     echo " Erreur ! ".$e->getMessage();
                     echo " Les datas : " ;
                    print_r($bdd);
                  }    
         
                            
                   
;                   } 
                   else {
                       $erreur = 'Votre pseudo ne doit pas dépasser 255 carractére!';
                   }
            }
            else 
            {
                $erreur = 'le champ "mot de passe" est vide!';
            }
        }
        else
        {
            $erreur = 'Le champ "pseudo" est vide!';
        }
    }

?>
<!DOCTYPE html>
    <html>
        <head>
            <title>Formulaire</title>
            <meta charset="UTF8" />
        </head>
        <body>
            <div style="text-align:center;" >
                <h2>Inscription</h2>
                <form method="POST" action="" style="text-align: center;">
                    <table style= "margin:auto;">
                        <tr style="text-align: center;">
                            <td>
                                <label>pseudo:</label>
                            </td>
                            <td>
                                <input type="text" placeholder="pseudo" name="pseudo" style="text-align: center;">
                            </td> 
                        </tr>
                            <tr>
                                <td>
                                    <label>Votre mot de passe</label>
                                </td>
                                <td style="text-align: center;"> 
                                    <input type="password" placeholder="Votre mote de passe" name="pass" style="text-align: center;">
                                </td>
                            </tr>
                            <tr>
                                <td>
                                    <td>
                                <input type="submit" value="Je m'incris" name="envoyer" />
                                </td>
                                <tr>
                                <td>
                                    <td>
                                    <?php
                                        if (isset($erreur)) 
                                        {
                                            echo '<font color= "red">'.$erreur."</font>";
                                            
                                        }
                                        else if(isset($erreur2))
                                                {
                                            echo '<font color= "green">'.$erreur2."</font>";
                                            
                                        }
                                            
                                ?>
                                </td>
                                </td>
                            </tr>
                            </td>
                            </tr>
                           
                    </table>
                </form>
            </div>

        </body>
    </html>
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
1934
Oulalalala....
Des erreurs de syntaxes html
Des erreurs dans le nom de tes variables
Toujours des soucis avec l'indentation

Bref.. ça devrait donner un truc du genre
<?php
//démarrage des sessions
session_start();


//connexion à la bdd (qu'il serait préférable de placer dans un fichier à part et d'en faire un require )
try{
  $bdd = new PDO('mysql:host:127.0.0.1:dbname=espace_membre,charset=utf-8','root',''); 
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}catch(Exeption $e){
    die('Erreur :' .$e->getMessage());
}
 
 
//récupération PROPRE des variables AVANT de les utiliser (en ternaire)
$pseudo =  isset($_POST['pseudo']) ? $_POST['pseudo'] : '' ;// htmlspecialchars ne doit JAMAIS s'utiliser pour des requêtes SQL... uniquement pour de l'affichage sur une page web
$pass =  !empty($_POST['pass']) ? sha1($_POST['pass']) : '' ;

$a_err = array(); // tableau contenant les éventuelles erreurs
if (isset($_POST['envoyer'])){
  
  //gestion des champs non remplis et de la taille du pseudo:
  $a_err[] = empty($pseudo) ? 'Le champ "pseudo" est vide !' : "";
  $a_err[] = empty($pass) ? 'le champ "mot de passe" est vide !' : "";
  $a_err[] = strlen($pseudo) <= 255 ? "Votre pseudo ne doit pas dépasser 255 carractéres !" : NULL;
  //traitement :$pseudolength 
  
 //Traitement si pas d'erreur :
  if(!empty($pseudo) && !empty($pass) && strlen($pseudo) > 255) {
    /* on insert les donnée dans la base de donée*/
    //on prepare la requête et les données
    $sql = "INSERT INTO membres(pseudo, mot_de_passe) VALUES (:pseudo,::pass) "; //toi tu avais mis : :mot_de_passe .. normal que ça ne marche pas !
    $datas = array(':pseudo' => $pseudo,':pass' =>  $pass )
    try {
      $insermbr = $bdd->prepare($sql);
      $insermbr->execute($datas); 
      $_SESSION['user'] = array('pseudo'=>$pseudo );
      $success = "Votre compte a bien été créé ";
      // mais à la place de juste afficher un message de succes... tu pourrais faire une redirection vers une autre page du site
      // par exemple :
      //header('location : zonemembre.php');
      //exit(); //toujours mettre un exit après une redirection !
    }catch(Exception $e){
      // en cas d'erreur :
        echo " Erreur ! ".$e->getMessage();
        echo " Les datas : " ;
        print_r($datas);
    }    
  } 
} // fin du if $_POST['envoyer']

?>
<!DOCTYPE html>
<html>
  <head>
      <title>Formulaire</title>
      <meta charset="UTF8" />
  </head>
  <body>
    <div style="text-align:center;" >
      <h2>Inscription</h2>
      <form method="POST" action="" style="text-align: center;">
        <table style= "margin:auto;">
          <tr style="text-align: center;">
            <td>
              <label>pseudo:</label>
            </td>
            <td>
              <input type="text" placeholder="pseudo" name="pseudo" style="text-align: center;">
            </td> 
          </tr>
          <tr>
            <td>
                <label>Votre mot de passe</label>
            </td>
            <td style="text-align: center;"> 
                <input type="password" placeholder="Votre mote de passe" name="pass" style="text-align: center;">
            </td>
          </tr>
          <tr>
            <td>
              <input type="submit" value="Je m'incris" name="envoyer" />
            </td>
          </tr>
          <tr>
            <td>
              <?php
                if (!empty($a_err))  {
                  foreach($a_err as $erreur){
                    echo '<font color= "red">'.$erreur."</font>";
                  }
                } else if(!empty($success)){
                    echo '<font color= "green">'.$success."</font>";
                }
            ?>
            </td>
            
          </tr>
        </table>
      </form>
    </div>

  </body>
</html>


Cordialement,
Jordane
Messages postés
73
Date d'inscription
mardi 2 janvier 2018
Statut
Membre
Dernière intervention
4 décembre 2019

bon j'ai l'erreur; c'est le
die('Erreur :' .$e->getMessage());

mais rien ne rentre dans ma bdd

Erreur :SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
jordane45
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
1934 > jordane45
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019

Voir même.. encore mieux en stipulant l'encodage utf-8
$bdd =new PDO('mysql:host=127.0.0.1;dbname=espace_membre;charset=utf8', 'root', '');
xooit21
Messages postés
73
Date d'inscription
mardi 2 janvier 2018
Statut
Membre
Dernière intervention
4 décembre 2019

ok merci bon ça a fonctionner dans la bdd mais j'ai encore une erreur

( ! ) Fatal error: Uncaught Error: Function name must be a string in D:\wamp64\www\formulaire.php on line 41
( ! ) Error: Function name must be a string in D:\wamp64\www\formulaire.php on line 41
jordane45
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
1934
Et la ligne 41... Elle contient quoi ?
xooit21
Messages postés
73
Date d'inscription
mardi 2 janvier 2018
Statut
Membre
Dernière intervention
4 décembre 2019


<?php
//démarrage des sessions
session_start();


//connexion à la bdd (qu'il serait préférable de placer dans un fichier à part et d'en faire un require )
try{
  $bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membres;charset=utf8','root',''); 
 // $bdd =new PDO('mysql:host=127.0.0.1;dbname=espace_membre;charset=utf8', 'root', '');
  
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}catch(Exeption $e){
    die('Erreur :' .$e->getMessage());
}
 
 
//récupération PROPRE des variables AVANT de les utiliser (en ternaire)
$pseudo =  isset($_POST['pseudo']) ? $_POST['pseudo'] : '' ;// htmlspecialchars ne doit JAMAIS s'utiliser pour des requêtes SQL... uniquement pour de l'affichage sur une page web
$pass =  !empty($_POST['pass']) ? sha1($_POST['pass']) : '' ;

$a_err = array(); // tableau contenant les éventuelles erreurs
if (isset($_POST['envoyer'])){
  
  //gestion des champs non remplis et de la taille du pseudo:
  $a_err[] = empty($pseudo) ? 'Le champ "pseudo" est vide !' : "";
  $a_err[] = empty($pass) ? 'le champ "mot de passe" est vide !' : "";
  $a_err[] = strlen($pseudo) <= 255 ? 'Votre pseudo ne doit pas dépasser 255 carractéres !' : NULL;
  //traitement :$pseudolength 
  
 //Traitement si pas d'erreur :
  if(!empty($pseudo) && !empty($pass) && strlen($pseudo) <= 255) {
    /* on insert les donnée dans la base de donée*/
    //on prepare la requête et les données
    $sql = "INSERT INTO membres(pseudo, mot_de_passe) VALUES (:pseudo,:pass) "; //toi tu avais mis : :mot_de_passe .. normal que ça ne marche pas !
    $datas = array(':pseudo' => $pseudo,':pass' =>  $pass );
    try {
      $insermbr = $bdd->prepare($sql);
      $insermbr->execute($datas); 
      $_SESSION['user'] = array('pseudo')($pseudo);
      $success = "Votre compte a bien été créé ";
      // mais à la place de juste afficher un message de succes... tu pourrais faire une redirection vers une autre page du site
      // par exemple :
      //header('location : zonemembre.php');
      //exit(); //toujours mettre un exit après une redirection !
    }catch(Exception $e){
      // en cas d'erreur :
        echo " Erreur ! ".$e->getMessage();
        echo " Les datas : " ;
        print_r($datas);
    }    
  } 
} // fin du if $_POST['envoyer']

?>
<!DOCTYPE html>
<html>
  <head>
      <title>Formulaire</title>
      <meta charset="UTF8" />
  </head>
  <body>
    <div style="text-align:center;" >
      <h2>Inscription</h2>
      <form method="POST" action="" style="text-align: center;">
        <table style= "margin:auto;">
          <tr style="text-align: center;">
            <td>
              <label>pseudo:</label>
            </td>
            <td>
              <input type="text" placeholder="pseudo" name="pseudo" style="text-align: center;">
            </td> 
          </tr>
          <tr>
            <td>
                <label>Votre mot de passe</label>
            </td>
            <td style="text-align: center;"> 
                <input type="password" placeholder="Votre mote de passe" name="pass" style="text-align: center;">
            </td>
          </tr>
          <tr>
            <td>
              <input type="submit" value="Je m'incris" name="envoyer" />
            </td>
          </tr>
          <tr>
            <td>
              <?php
                if (!empty($a_err))  {
                  foreach($a_err as $erreur){
                    echo '<font color= "red">'.$erreur."</font>";
                  }
                } else if(!empty($success)){
                    echo '<font color= "green">'.$success."</font>";
                }
            ?>
            </td>
            
          </tr>
        </table>
      </form>
    </div>

  </body>
</html>

jordane45
Messages postés
27058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 décembre 2019
1934
Et ca correspond à mon code ?
Je ne pense pas que cette ligne soit bonne...
$_SESSION['user'] = array('pseudo')($pseudo);



$_SESSION['user'] = array('pseudo'=>$pseudo);