Donnés dans la base de donnéé php

Résolu
bonsoir a tous. J'ai realisé un formulaire d'inscription et de connection mais le soucis est que lorsque je fini de remplir mes champs du formulaire les information ne vont pas dans ma base de donné or je suis bien redirigé vers mon form de connection après avoir remplir celui d'inscription . Je ne sais donc pas ou vont mes données puisque je suis redirigé sur ma page de connection comme je le desir. Je vous envoie mon fichier de connection a la bdd, mon fichier inscript.ph et mon fichier connection.php. Pouvez -m'aider svp? depuis une semaine je cherche solution en vains. NB: je suis une debutante ohh. merci d'avance

inscript.php


<?php
include'connection.php';

 if(isset($_POST['forminscription']))
{
    $pseudo = addslashes($_POST['pseudo']);
    $email= addslashes($_POST['email']);
    $mdp = sha1($_POST['password']);
    $mdp2 = sha1($_POST['password']);

    if((!empty($pseudo))  && (!empty($email)) && (!empty($mdp)) && (!empty($mdp2)))
    {
        if(strlen($pseudo)<=20)
        {
            if(filter_var($email, FILTER_VALIDATE_EMAIL))
            {
                if($mdp == $mdp2)
                {
                    $con = getPDO();
                    $rowEmail = countDatabaseValue($con, 'Email', $email);
                    if($rowEmail == 0)
                    {
                      $rowpseudo = countDatabaseValue($con, 'Pseudo', $pseudo);
                      if($rowpseudo == 0)
                      {
                     $insertmbr = $con->prepare("INSERT INTO clients(Pseudo, Email, Motdepasse) VALUES(?, ?, ?)");
                          $insertmbr ->execute([
                              $pseudo,
                               $email,
                              $mdp
                          ]);
                          $succesMessage ='votre compte a bien été créé!!!!';
                          header('location:login.php');
                      }
                      else{
                          $errorMessage = 'ce pseudo est deja utilisé...';
                      }
                    }
                    else{
                      $errorMessage = 'cet email existe déja...';
                  }
                }
                else{
                  $errorMessage = 'les mots de passe ne correspondent pas...';
              }
            }
            else{
              $errorMessage = 'votre email est invalide...';
          }
        }
        else{
          $errorMessage = 'ce pseudo est trop long...';
      }
    }
    else{
      $errorMessage = 'veuillez remplir tous les champs...';
  }
}
?>


<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Input form</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
  <form action="" method="post">
        <div class="box">
          <h2>Formulaire Inscription</h2>

    <div class="inputBox">
        <input type="text" name="pseudo" required="">
        <label >pseudo</label>
    </div>
    <div class="inputBox">
        <input type="text" name="email" required="">
        <label>email</label>
    </div>
    <div class="inputBox">
        <input type="password" name="password" required="">
        <label>Motdepasse</label>
    </div>
    <div class="inputBox">
        <input type="password" name="password" required="">
        <label>ConfirmMotdepasse</label>
    </div>
        <input type="submit" name="forminscription" value="Je m'inscris">
        <!--<p>Apres inscription veillez cliquer sur<a href="registrer.php">Se connecter</a></p>-->
          Avez vous deja un compt?<a href="login.php" style="text-decoration: none; font-family: 'Play', sans-serif; color: yellow;"> log in</a>
          </form>
        <?php

if(isset($erreur))
  {
    echo $erreur;
  }
   ?>
      </div>


      </body>
    </html>





8 réponses

Résumé de la discussion

Le problème décrit est que les données du formulaire d'inscription ne sont pas enregistrées dans la base de données et que l’utilisateur est redirigé vers le formulaire de connexion après l’inscription. Plusieurs conseils préconisent d’activer les messages d’erreur PDO et de désactiver temporairement les redirections afin d’afficher les erreurs et d’identifier rapidement l’emplacement du blocage dans le code. Des vérifications essentielles concernent les noms des champs et leur correspondance avec le PHP, notamment éviter deux champs mot de passe identiques et corriger la comparaison, ainsi que vérifier l’appel à execute et l’insertion. D’autres pistes évoquées incluent l’usage d’un champ avatar par défaut et une meilleure gestion des erreurs pour renseigner l’utilisateur sur les écarts entre les données et les contraintes.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    Commence par appliquer ceci : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

    Et ça : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

    Et, afin de pouvoir voir l'erreur, il faut que tu désactives les redirections. (sinon tu ne verras pas les messages d'erreurs... )

    0
    1. MERCI pour votre aide , et votre promptitude
      0
    2. Bonjour .j'ai effectivement activé les erreur dans la page de connection et meme supprimer la redirection mais toujours meme chose. Au faite on ne m'affiche pas d'erreur mais mes données ne vont pas non plus dans ma bdd. Or comme je dis sa fait une semaine que je suis dessus, le lundi passé j'ai eu ce meme probleme et j'ai du rectifier le name de mes variables afin qu'elle soit soit concordante et qu'elles puissent passer et au finish c'est passé , les donnés partaient dans ma bdd mais voila que pour un rien depuis le mercredi passé sa passe plus . Donc je ne comprends pas ce qui peut etre le probleme
      0
    3. Modérateur
      @Esther_3379Il te faut donc désormais nous montrer le code "modifié" pour qu'on puisse voir ce que tu as oublié...
      0
    4. @jordane45d'accord je vous montre.

      
      conncetion.php
      
      
            <?php
            //connexion a la bd
           error_reporting(E_ALL);
           ini_set('display_errors',TRUE);
           ini_set('display_startup_errors', TRUE);
      
            function getPDO(){
                try{
                    $con = new PDO('mysql:dbname=mabase; host=127.0.0.1', 'root', '');
                    $con->exec("SET CHARACTER SET UTF8");
                    return $con;
                     // Activation des erreurs PDO
                  $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
                  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                   $con->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                   }
      
                   catch(PDOException $e){
                       var_dump($e);
                       echo 'connection failed: ' or die('Erreur : ' . $e->getMessage());
                   }
            }
      
            function countDatabaseValue($con, $key, $value){
                $request = "SELECT * FROM clients WHERE $key = ?";
                $rowCount = $con->prepare($request);
                $rowCount->execute(array($value));
                return $rowCount->rowCount();
            }
      
      
          ?>
      
      
      
      
      0
    5. Modérateur
      @jordane45Ah.. et tu ne peux pas avoir deux fois le même "name" pour tes password...
      Change le second en password2
      0
  2. merci pour votre aide.
    0
    1. Modérateur

      j'ai eu a faire des corrections sur le code parce qu'on m'affichait des erreurs

      J'ai écrit le code de tête.. sans le tester. Donc c'est possible en effet qu'il y ai des erreurs

      Par contre, il serait pas mal de nous montrer ce que tu as modifié...
      Car, tu devrais avoir un message qui s'affiche...

      Et puis, pour être sûr, pourrais tu nous montrer la structure de ta bdd ?

      0
      1. bonjour a tous. OK je vous envoie donc le fichier modifié et la structure de ma table
        0
    2. 
      -- phpMyAdmin SQL Dump
      -- version 4.9.2
      -- https://www.phpmyadmin.net/
      --
      -- Hôte : 127.0.0.1:3306
      -- Généré le :  mer. 20 mai 2020 à 10:40
      -- Version du serveur :  10.4.10-MariaDB
      -- Version de PHP :  7.3.12
      
      SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
      SET AUTOCOMMIT = 0;
      START TRANSACTION;
      SET time_zone = "+00:00";
      
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;
      
      --
      -- Base de données :  `mabase`
      --
      
      -- --------------------------------------------------------
      
      --
      -- Structure de la table `clients`
      --
      
      DROP TABLE IF EXISTS `clients`;
      CREATE TABLE IF NOT EXISTS `clients` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `Pseudo` varchar(255) CHARACTER SET utf8 NOT NULL,
        `Email` varchar(255) CHARACTER SET utf8 NOT NULL,
        `Motdepasse` varchar(255) CHARACTER SET utf8 NOT NULL,
        `avatar` varchar(11) NOT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=latin1;
      
      --
      -- Déchargement des données de la table `clients`
      --
      
      INSERT INTO `clients` (`id`, `Pseudo`, `Email`, `Motdepasse`, `avatar`) VALUES
      (1, 'Datto', 'estelle', 'estelledatto.03@gmail.com', '0'),
      (9, 'Dolou', 'shiva', '', '0'),
      (3, 'gagou', 'antoine', 'gagouantoine@gmail.com', '0'),
      (4, 'Datto', 'antoine', 'gagouantoine@gmail.com', '0'),
      (5, 'Datto', 'antoine', 'estelledatto.03@gmail.com', '0'),
      (6, 'malone', 'miriém', 'desouza@gmail.com', '0'),
      (7, 'allelouya', 'amen', 'amen@gmail.com', '0'),
      (8, 'Fryte', 'etyu', 'fre@gmail.com', '0'),
      (10, 'vako', 'shiva', '', '0'),
      (11, 'digbeuta', 'bonsoir', 'sdf@gmail.com', '0'),
      (13, 'red', 'abib', 'aku@gmail.com', '0'),
      (14, 'cft', 'cfao', 'cfa@gmail.com', '0'),
      (15, 'hu', 'ju', 'gh@gmail.com', '0'),
      (16, 'elie', 'aman', 'aman@gmail.com', '0'),
      (18, 'maya', 'louise', 'may@gmail.com', '0'),
      (20, 'junior', 'kausronlab@gmail.com', 'f3a3e91ead339309af864f4fe0a884db456d42ba', '0'),
      (21, 'djao', 'djao@gmail.com', '7110eda4d09e062aa5e4a390b0a572ac0d2c0220', '0'),
      (22, 'aime', 'aim@gmail.com', '37db39666e5ba650dd188e0a58d8af89f48f61cf', '0'),
      (23, 'fala', 'fala@gmail.com', '88e6101730f4cf454196252e1e1e2e77fd30da4c', '0'),
      (24, 'queenB', 'emrickyann@gmail.com', 'f0fd596f396d8fc32d5e4fe4c73c61fa2ac55c70', '0'),
      (25, 'oumar', 'sy@hotmail.com', '8af56de68279cb6f5ed022f31af18b9fcdcc2e92', '0');
      COMMIT;
      
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
      
      
      
      0
      1. Voici ce que j'ai modifié dans le fichier Clients.class.php. J'ai modifié tout les return $res en return $this car cela m'affichais des erreurs..

         <?php
         class Clients{
          
          private $bdd;
          
          function __construct($bdd = null){
            if(!empty($bdd)){
              $this->bdd = $bdd;
            }else{
               $this->bdd = getPDO();
            }
          }
          
          
          public function getClientByEmail($email){
             $sql = "SELECT Email FROM clients WHERE Email = ? ";
             $datas = array($email);
             try{
                $prep = $this->bdd->prepare($sql);
                $prep->execute($datas);
                $res = $prep->fetchAll();
                return $this;
             }catch(Exception $e){
               echo "Erreur SQL : " . $e->getMessage();
             }
          }
          
          public function getClientByPseudo($pseudo){
             $sql = "SELECT Pseudo FROM clients WHERE Pseudo = ? ";
             $datas = array($pseudo);
             try{
                $prep = $this->bdd->prepare($sql);
                $prep->execute($datas);
                $res = $prep->fetchAll();
                return $this;
             }catch(Exception $e){
               echo "Erreur SQL : " . $e->getMessage();
             }
          }
          
          public function addClient($pseudo,$email,$mdp){
            $sql = "INSERT INTO clients(Pseudo, Email, Motdepasse) VALUES(?, ?, ?)";
            
            /*
               $mdp = password_hash($mdp);
            */
            $mdp = password_hash($mdp,PASSWORD_DEFAULT); // A changer par la ligne au dessus si version php compatible !
            
            
            $datas = array($pseudo,$email,$mdp);
            try{
                $prep = $this->bdd->prepare($sql);
                $prep->execute($datas);
                 // Retourne le numero auto-incrément de la table pour l'enregistrement créé
                return $this;
             }catch(Exception $e){
               echo "Erreur SQL : " . $e->getMessage();
             }
          }
          
          // Fin de la class Clients
        }
        ?>
        0
        1. Modérateur
          J'ai modifié tout les return $res en return $this

          N'importe quoi !!
          Si ça te retourne une erreur... indique nous laquelle pour qu'on essaye de la corriger .. au lieu de retourner n'importe quoi qui ne donnera pas l'effet escompté !
          0
        2. @jordane45excusez moi
          0
      2. et enfin le fichier inscript.php

        <?php
        
        
        // fichier inscript.php
        
         error_reporting(E_ALL);
         ini_set('display_errors',TRUE);
         ini_set('display_startup_errors', TRUE);
        
         require_once 'connection.php';
         $con = getPDO();
        
        
        require_once "Clients.class.php";
        //on instancie la class Clients
        $oClient = new Clients($con);
        
        if(isset($_POST['forminscription'])) {
          $pseudo = !empty($_POST['pseudo']) ? trim($_POST['pseudo']) : NULL;
          $email = !empty($_POST['email']) ? trim($_POST['email']) : NULL;
          $mdp = !empty($_POST['password']) ? trim($_POST['password']) : NULL;
          $mdp2 = !empty($_POST['password2']) ? $_POST['password2'] : NULL;
          if((!empty($pseudo))  && (!empty($email)) && (!empty($mdp)) && (!empty($mdp2))) {
             if(strlen($pseudo)<=20) {
               if($mdp == $mdp2){
                
                  $clientMail = $oClient->getClientByEmail($email);
                  if(empty($clientMail)){
                    $clientPseudo = $oClient->getClientByPseudo($pseudo);
                    if(empty($clientPseudo)){
                      $addC = $oClient->addClient($pseudo,$email,$mdp);
                      $succesMessage ='votre compte a bien été créé!!!!';
                      //header('location:login.php'); // Désactivé le temps des tests
                      exit;
                    }else{
                      $errorMessage = 'ce pseudo est déjà utilisé...';
                    } 
                  }else{
                    $errorMessage = 'cet email existe déja...';
                  }      
               }else{
                  $errorMessage = 'les mots de passe ne correspondent pas...'; 
               }
            }else{
              $errorMessage = 'ce pseudo est trop long...';
            }
          }else{
            $errorMessage = 'veuillez remplir tous les champs...';
          }
        }
        
        
            
        ?>
        
        
        
        <!DOCTYPE html>
        <html lang="en" dir="ltr">
          <head>
            <meta charset="utf-8">
            <title>Input form</title>
            <link rel="stylesheet" href="style.css">
          </head>
          <body>
          <form action="" method="post">
                <div class="box">
                  <h2>Formulaire Inscription</h2>
        
            <div class="inputBox">
                <input type="text" name="pseudo" required="">
                <label >pseudo</label>
            </div>
            <div class="inputBox">
                <input type="text" name="email" required="">
                <label>email</label>
            </div>
            <div class="inputBox">
                <input type="password" name="password" required="">
                <label>Motdepasse</label>
            </div>
            <div class="inputBox">
                <input type="password" name="password2" required="">
                <label>ConfirmMotdepasse</label>
            </div>
                <input type="submit" name="forminscription" value="Je m'inscris">
                
                  </form>
                <?php
        
        if(isset($erreur))
          {
            echo $erreur;
          }
           ?>
              </div>
        
        
              </body>
            </html>
        
        0
        1. mais sans vous mentir je ne comprends pas bien l'action qui est mené par le code dans le fichier inscript de la ligne 16 a 31. Quand j'interprete avec ma petite connaissance ça ne passe pas bien dans mon esprit. Pouvez vous m'expliquer svp ces lignes que j'ai citées plus haut. Merci

          Cordialement
          0
      3. Modérateur
        Au passage.... si tu regardes ta fonction de connexion à la bdd ... ne vois tu pas une erreur ???!

        Tu fais le "return $con" AVANT d'avoir activé l'affichage des erreurs PDO !

        Donc en changeant comme ceci
        function getPDO(){
          try{
            $con = new PDO('mysql:dbname=mabase; host=127.0.0.1', 'root', '');
            $con->exec("SET CHARACTER SET UTF8");
           
             // Activation des erreurs PDO
            $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
            // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
             $con->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
             
            return $con;
         }catch(PDOException $e){
             var_dump($e);
             echo 'connection failed: ' or die('Erreur : ' . $e->getMessage());
         }
        }
        


        Tu verras que le code que je t'ai donné fonctionne.
        Sauf qu'il t'affiche une erreur :

        Erreur SQL : SQLSTATE[HY000]: General error: 1364 Field 'avatar' doesn't have a default value

        Et oui.. tu n'as pas défini de valeur par défaut à ton champ "avatar" dans ta bdd...

        Donc soit tu en définis un ...
        Soi tu ajoutes l'avatar en parametre pour la création du client...

        0
        1. Modérateur
          Tu peux aussi modifier la class Client par celle la:
          <?php
          // Fichier Clients.class.php
          
          class Clients{
            
            private $bdd;
            
            function __construct($bdd = null){
              if(!empty($bdd)){
                $this->bdd = $bdd;
              }else{
                 $this->bdd = getPDO();
              }
            }
            
            
            public function getClientByMail($email){
               $sql = "SELECT Email FROM clients WHERE Email = ? ";
               $datas = array($email);
               try{
                  $prep = $this->bdd->prepare($sql);
                  $prep->execute($datas);
                  $res = $prep->fetchAll();
                  return $res;
               }catch(Exception $e){
                 echo "Erreur SQL : " . $e->getMessage();
               }
            }
            
            public function getClientByPseudo($pseudo){
               $sql = "SELECT Pseudo FROM clients WHERE Pseudo = ? ";
               $datas = array($pseudo);
               try{
                  $prep = $this->bdd->prepare($sql);
                  $prep->execute($datas);
                  $res = $prep->fetchAll();
                  return $res;
               }catch(Exception $e){
                 echo "Erreur SQL : " . $e->getMessage();
               }
            }
            
            public function addClient($pseudo,$email,$mdp){
              $sql = "INSERT INTO clients(Pseudo, Email, Motdepasse,avatar) VALUES(?,?,?,?)";
              
              /**
              // Si php > 5.6
                 $mdp = password_hash($mdp);
              */
              //$mdp = sha1($mdp); // A changer par la ligne au dessus si version php compatible !
              $mdp = password_hash($mdp,PASSWORD_DEFAULT); 
              
              $datas = array($pseudo,$email,$mdp,"");
              try{
                  $prep = $this->bdd->prepare($sql);
                  $res = $prep->execute($datas);
                  $newId = $this->bdd->lastInsertId(); // Retourne le numero auto-incrément de la table pour l'enregistrement créé
                  return array('new_id'=>$newId);
               }catch(Exception $e){
                 echo "Erreur SQL : " . $e->getMessage();
               }
            }
            
            // Fin de la class Clients
          }
          

          Qui, ne retournera plus de souci avec le $res ( qui etait celui du addClient ... )
          0
        2. D'accord. excusez moi encore
          0
        3. Modérateur
          @jordane45Au passage, pour l'authentification des clients sur ton site, tu pourras utiliser ( en l'ajoutant dans la class clients) la fonction
           /**
             * Fonction permettant de vérifier si l'utilisateur existe en fonction de son login et password
             */
            public function authentification($pseudo,$mdp){
              $user = $this->getClientByPseudo($pseudo);
              //verifie qu'il n'y a bien qu'un seul user avec ce pseudo..
              if(!empty($user) && count($user)==1){
                $mdpBdd = $user[0]['Motdepasse'];
                if (password_verify($mdp, $mdpBdd)){
                  return $user;
                }else{
                  return false;
                }
              }
            }
          


          et dans ton code pour ton formulaire de login, y faire appel
          $user = $oClient-> authentification($pseudo,$mdp);
          if($user ){
             //ici ce que tu veux faire si le client est bien identifié..
             // par exemple 
             print_r($user);
          }
          
          0
        4. Voici ce qu'on m'affiche
          
          Fatal error: Uncaught Error: Call to undefined method Clients::getClientByEmail() in C:\wamp64\www\phpmon\ESTHER\formu1\inscript.php on line 27
          
          
          0
        5. Modérateur
          @Esther_3379Regarde la class.
          La fonction se nomme getClientByMail
          J'ai sûrement modifié sans le faire exprès
          0
      4. bonsoir a tous et merci pour votre aide, mes données vont dans ma bdd et j'arrive a m'inscrire et me connecter correctement.
        0