Données formulaire qui ne s'inscrivent pas dans la BDD

Ce topic a été résolu
fanhmm2

fanhmm2 Le 10 octobre 2019 à 21:43 (Édité le 14 octobre 2019 à 03:39)

Bonjour à tous/toutes !J'ai suivi le tuto de Primfx sur youtube pour créer un espace membre, et je m'en suis inspiré pour me faire un TP pour apprendre aussi à utiliser WAMP et phpmyadmin, mais j'ai essayé plein de corrections sur mon code et y a rien à faire ma BDD ne veut rien enregistrer, j'y suis depuis 3 jours dessus à essayer de trouver l'erreur.
Pour vérifier l'enregistrement j'utilise le lien "afficher" qui se trouve dans la page de gestion de la BDD.
Ou alors aussi je clique sur le nom de ma table "identité".
Dans ma base j'ai mis une valeur null par défaut au champ avatar car dans le formulaire je n'ai pas de champ de saisie portant ce nom, mais plutot un label qui a ce nom "avatar".
Pour le submit j'utilise un simple boutton normal mais avec un onclick vers une fonction JS qui fait "forms.submit();" et effectivement les données sont envoyées, j'ai pu tester les erreurs de saisies par exemple grace à l'echo de $info, et de plus il y a bien redirection vers la page index.php, donc la boucle d'envoie est valide.

Voici mon formulaire et mon code php, si vous pouviez me dépanner ce serait bien cool  😉
(Note : La balise "CODE" ici ne semble pas fonctionner :/ )

********* LA PAGE INDEX.PHP ******************
<html>
<head>

<title>Inscription</title><link rel="stylesheet" href="inscription.css" />

<script type="text/javascript" src="js/inscription.js"></script>

</head>

<body>
<span id="retour" onclick="window.location='index.php';">Accueil</span>
<div id="titre">Bienvenue !</div>
<div id="soustitre">Vous avez fait le bon choix, ce site est vraiment trés pratique.</div>

<div id="cadre">
   <div id="champs">
      <form name="myform" action="inscription.php" method="post">
      <span>Saisissez votre pseudo</span></br>
      <input name="pseudo" type="text" size="20"></p>      <span>Saisissez votre mot de passe</span></br>
      <input name="pass" type="text" size="20"></p>
      <div id="saisie_mail">
         <span>Saisissez votre adresse mail</span></br>
         <input name="email" type="text" size="20">
      </div>
      <div id="saisie_adresse">
         <span>Saisissez votre adresse postale</span></br>
         <input name="adresse" type="text" size="20">
      </div></p>
      <label>cliquez sur "parcourir" pour sélectionner le fichier d'image</label></br>
      <input type="file"
            id="avatar" name="avatar"
            accept="image/png, image/jpeg" onchange='document.getElementById("fichier").innerHTML="Fichier : "+this.value;'>
      <input type='button' onclick='document.getElementById("avatar").click();' value='parcourir'> <label id="fichier">Aucun fichier choisi</label></br>
      <div id="submit"><input type="button" style="width:100px; font-size:18px;" value="Valider" onclick="envoit()"></div>
      </form>
   </div>
</div>

</body>
</html>

***************** CODE PHP (la page inscription.php) *********************
<?PHP/* Inscription d'un membre dans la base de données.*/

// Connection à la base.

$bdd=new PDO('mysql:host=127.0.0.1;dbname=membres','root','');

if(isset($_POST))
{
   if(!empty($_POST['pseudo'])and !empty($_POST['pass'])and !empty($_POST['email'])and !empty($_POST['adresse']))
   {
      $pseudo=htmlspecialchars($_POST['pseudo']);
      $pass=htmlspecialchars($_POST['pass']);
      $passhash=password_hash($pass, PASSWORD_DEFAULT);
      $email=htmlspecialchars($_POST['email']);
      $adresse=htmlspecialchars($_POST['adresse']);
      $avatar=htmlspecialchars($_POST['avatar']);
      if(strlen($pass)>7)
      {
         if(filter_var($email, FILTER_VALIDATE_EMAIL))
         {
            $req=$bdd->prepare('INSERT INTO identité(pseudo,pass,mail,adresse,avatar) VALUES(?,?,?,?,?)');
            $req->execute(ARRAY($pseudo,$passhash,$email,$adresse,$avatar));
            $info='vous êtes connecté !';
            header('Location:index.php');
         }else
         {
            $info='Votre adresse email n\'est pas valide';   
         }
      }else
      {
         $info='Votre mot de passe est inférieur à 8 caractères !';      }
   
      
   }
   else
   {
      $info='Un des champs est vide !';   }
   echo $info;
}

mysql_close();

?>
Alexandre1995

Alexandre1995 Le 14 octobre 2019 à 13:36

@fanhmm2 Escuse-moi du temps de retard, mais je te souhaite bravo pour ton problème résolue 
peux tu indiquer ton dernier commentaire en "meilleur réponse""? 

@Doppler Salut, peux-tu regarder ta boite-mail s'il te plaît celle qui correspond à celle de Youtube ? 
Merci, et tant pis si tu ne peux pas. 

Sur ce Bye !
Meilleure réponse
fanhmm2

fanhmm2 Le 10 octobre 2019 à 21:46 (Édité le 10 octobre 2019 à 22:35)

Apparemment la balise code fonctionne même si on ne la voit pas dans la saisie du texte..

Si je mets l'instruction mysql_close() ou mysql_close($mybdd) à la fin de la page inscription.php alors j'ai le message d'erreur : "Warning: mysql_close() expects parameter 1 to be resource"
Je vois pas d'où ça vient :/
Profil introuvable

Profil introuvable Le 11 octobre 2019 à 05:35

Hello @fanhmm2,

Déjà je te conseille de ne plus utiliser Wamp 😉 Pourquoi ? Parce que ça et ça 😉 Les tutos de Boris sont obsolètes... 🙅 Je te conseille de désinstaller Wamp pour installer XAMPP en suivant la procédure 😉
Tu utilises MYSQL qui est devenu obsolète, il est recommandé d'utiliser PDO 😉 Regarde dans les formations de @Clouder, je pense que cela t'aidera pour ton problème 😉
Pour la balise [CODE] en effet c'est un calvaire quand tu utilises Google Chrome mais elle fonctionne très bien avec Firefox 😉 Boris n'a toujours pas corrigé les bugs signalés...
Alexandre1995

Alexandre1995 Le 11 octobre 2019 à 08:44

Bonjour @Fanhmm2
Comme la précisé @Jerem971
Mysql est obsolète il éxiste cependant 2 solutions: MYSQL[I] ou PDO 
En suivant des forums à la trace PDO semble la plus sûr pour ton travail.
Alexandre1995

Alexandre1995 Le 11 octobre 2019 à 08:46

@fanhmm2,

Je te conseille ce lien pour ce que tu recherches: https://www.sitedudev.com/cours/creer-son-site 
ça a était fait par @Clouder
fanhmm2

fanhmm2 Le 11 octobre 2019 à 12:29 (Édité le 11 octobre 2019 à 12:30)

Merci de vos conseils 😉
Et pour PDO je croyais que c'était juste une commande pour acceder à la base, je savais pas que ça remplaçait mysql :/
Vous dites que la base Mysql est obsolete et pourtant tout le mon,de l'utilise meme dans les tutos récents à ce que j'ai vu, c'est bizarre. Et Xamp c'est pas que pour Linux ?
Merci encore je vais regarder vos liens 😉
fanhmm2

fanhmm2 Le 11 octobre 2019 à 12:36

Je viens de voir le site de clouder il parle de mysql lui aussi, et pour préparer les requetes il fait comme dans mon code, enfin c'est plutot moi qui fait comme lui 😉
fanhmm2

fanhmm2 Le 11 octobre 2019 à 12:52 (Édité le 11 octobre 2019 à 13:44)

Alexandre, dans la formation que tu m'a dis, il est écrit :
"Rajouter cette fonction dans la classe connexionDB." il parle de la fonction de connection, mais il voulait dire le fichier connectionDB ou la classe connectionDB ? Car il ne dit pas où mettre la fonction dans la classe.
EDIT : Bon du coup je vais désinstaller wamp et installer Xamp 😉

Et dans le site où clouder montre une fonction de lui pour insérer, modifier, supprimer dans la base, il montre l'exemple d'utilisation de sa fonction avec INSERT, UPDATE, et DELETE, mais pour delete il a écrit query() au lieu de insert()  donc pour DELETE il n'utilise pas semble-t'il sa fonction insert(), c'est bizarre.
fanhmm2

fanhmm2 Le 11 octobre 2019 à 13:46

Bon, je vous remercie vraiment beaucoup, vous êtes super ! J'ai adapté le code PHP avec fonctions persos de clouder à mon cas et ça marche bien, mes données sont enfin enregistrées 😉
fanhmm2

fanhmm2 Le 11 octobre 2019 à 14:02 (Édité le 11 octobre 2019 à 14:04)

RE moi :/

Tout fonctionne sauf l'adresse qui ne s'enregistre pas, je vois pas ou est l'erreur :/

voici le code :

<?php
  // Déclaration d'une nouvelle classe
  class connexionDB {
    private $host    = 'localhost';   // nom de l'host
    private $name    = 'membres';     // nom de la base de donnée
    private $user    = 'root';        // utilisateur
    private $pass    = '';        // mot de passe
    //private $pass    = '';          // Ne rien mettre si on est sous windows
    private $connexion;
                    
    function __construct($host = null, $name = null, $user = null, $pass = null){
      if($host != null){
        $this->host = $host;           
        $this->name = $name;           
        $this->user = $user;          
        $this->pass = $pass;
      }
      try{
        $this->connexion = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name,
          $this->user, $this->pass, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8', 
          PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
      }catch (PDOException $e){
        echo 'Erreur : Impossible de se connecter  à la BDD !';
        die();
      }
    }
    
    public function query($sql, $data = array()){
      $req = $this->connexion->prepare($sql);
      $req->execute($data);
      return $req;
    }
    
    public function insert($sql, $data = array()){
      $req = $this->connexion->prepare($sql);
      $req->execute($data);
    }
  }
  
  // Faire une connexion à votre fonction
  $DB = new connexionDB();
  
   /* A partir de là c'est mon code où j'utilise la fonction de clouder */

  if(isset($_POST))
{
   if(!empty($_POST['pseudo'])and !empty($_POST['pass'])and !empty($_POST['email'])and !empty($_POST['adresse']))
   {
      $pseudo=htmlspecialchars($_POST['pseudo']);
      $pass=htmlspecialchars($_POST['pass']);
      $passhash=password_hash($pass, PASSWORD_DEFAULT);
      $email=htmlspecialchars($_POST['email']);
      $adresse=htmlspecialchars($_POST['adresse']);
      $avatar=htmlspecialchars($_POST['avatar']);
      if(strlen($pass)>7)
      {
         if(filter_var($email, FILTER_VALIDATE_EMAIL))
         {
            $DB->insert("INSERT INTO identité(pseudo,pass,mail,adresse,avatar) VALUES(?,?,?,?,?)",array($pseudo,$passhash,$email,$adresse,$avatar));
            $info=$pseudo.' vous êtes connecté !';
            //header('Location:index.php');
         }else
         {
            $info='Votre adresse email n\'est pas valide';   
         }
      }else
      {
      $info='Votre mot de passe est inférieur à 8 caractères !';
      }
   }
   else
   {
   $info='Un des champs est vide !';
   }
   echo $info;
}
            
?>
Alexandre1995

Alexandre1995 Le 11 octobre 2019 à 15:06 (Édité le 11 octobre 2019 à 15:08)

@fanhmm2
Salutation enfaîte le pdo s'écrit avec du Mysql, pourquoi ? Car mysql est une INJECTION et pas le code en mysql 
En par exemple mysql est totalement obsolète et peut-être que mysqli va l'être
Pourtant du PDO on l'écrit: PDO(mysql simplement car on parle d'injection ^-^
Selon mes sources, donc peut-être que je me trompe
Je vais regarder de suite ton code, je te tient au courant
(Pour ça qu'on te propose PDO car si tu (comme moi) programme une chose en mysqli puis dans 2-3 ans il ne fonctionne plus tu devras le convertir 😀 donc autant le faire des le début.

Bon je go lire 
peux tu écrire le nom de tes fichiers au dessus du code à chaque fois ? 
ex:

Index.php
<html>
...
Alexandre1995

Alexandre1995 Le 11 octobre 2019 à 15:12 (Édité le 11 octobre 2019 à 15:19)

On peux voir ta bdd ? 
Et ton fichier "inscription"
Quand tu dis que l’adresse mail ne s'enregistre pas, tu as un message d'erreur ? 
As-tu relié ton fichier ta variable email à ta connexionbd ?


J'ai besoin: 
-Nom des documents et postions ( dans un dossier ou à la racine )
-Voir ton fichier qui communique avec donc sûrement ton fichier inscription
-Voir ta base de données ( peut-être phpmyadmin ) 
fanhmm2

fanhmm2 Le 11 octobre 2019 à 17:44 (Édité le 11 octobre 2019 à 17:53)

Bonsoir Alexandre 😉
peux tu écrire le nom de tes fichiers au dessus du code à chaque fois ? 
En comme j'ai fait dans le premier message du post  😉
Le formulaire c'est celui que  j'ai mis en premier post, et pour le code PHP c'est celui de mon dernier code posté et qui est contenu dans le fichier "inscription.php".

Quand à la structure de la base c'est ça (je sais pas copier la structure de la base pour l'afficher ici) :
id  : Type INT en auto-incrément.
pseudo : Type charvar 255
pass : Type charvar 255
mail : Type charvar 255
adresse : Type charvar 255
avatar : Type charvar 255 valeur NULL par défaut.

oui j'utilise phpmyadmin.
l'inscription fonctionne bien sauf pour le champ "adresse".
il y a un fichier inscription.html et un fichier inscription.php dans l'action du form. 
Tous les charvar sont en interclassement Latin1_swedish
Dans le dossier www de phpmyadmin il y a le dossier "site" qui contient mes pages de code :
www\site
Le javascript lui, est dans le dossier "www\site\js"

Voilà 😉
Merci de tenter de m'aider 😉
fanhmm2

fanhmm2 Le 11 octobre 2019 à 18:02 (Édité le 11 octobre 2019 à 18:09)

Je viens de tester un truc, dans l'adresse j'ai enlevé tous les chiffres et laissé que le texte, et ça marche, mais alors comment faire pour enregistrer dans l'adresse le numéro de rue, le code postal etc ?

EDIT : AH non, jai mis que le mot "rue" pour que ça marche mais c'est quand je met "rue de la république" que ça s'inscrit pas.
fanhmm2

fanhmm2 Le 11 octobre 2019 à 18:21 (Édité le 11 octobre 2019 à 19:19)

Ca y est j'ai trouvé le problème, avec des essais, ça venait du fait qu'au mot république il y a un é avec accent aigus, mais si je mets pas d'accents ça marche même avec le numéro de rue et le code postal.

10 Rue de la république = marche pas !
10 Rue de la republique = s'enregistre !

EDIT : SUR le web j'ai trouvé ce lien :
https://programmation-web.net/2010/11/comment-resoudre-les-problemes-daccents/
Je l'ai lu mais je sais pas appliquer leurs conseils :/
Par exemple je sais pas où placer ça : SET NAMES 'utf8'; dans inscription.php
Et aussi parametrer la BDD avec phpmyadmin pour changer le type de caractère de la DB 

EDIT : voilà j'ai reussi à changer le type caractère de ma table identité en lui donnant "UTF8_general_ci"
Me reste plus qu'à trouver comment pour le code PHP de inscription.php  :/ et là je sais pas :/
Alexandre1995

Alexandre1995 Le 11 octobre 2019 à 19:40 (Édité le 11 octobre 2019 à 20:33)

@fanhmm2
Pour ta base de donnée : [Windows] + écrit : capture
capture d'écran tu prends un screen

Et tient ton erreur:
$email=htmlspecialchars($_POST['email']);
ta variable $email c'est ok
Mais tu la post dans "email"
Or dans ta data base email n'existe pas,

$email=htmlspecialchars($_POST['email']);
ça devient =
$email=htmlspecialchars($_POST['mail']);

Si ça marche mes le topic en résolu et marque la réponse qui ta aidé.

Edit: Je pense pas que tu l'as vu, mais c'est sûrement une erreur en recopiant pour ta base de donnée car tu as du copier coller mais regarde:
$DB->insert("INSERT INTO identité(pseudo,pass,mail,adresse,avatar) Les catégories dans ta base de donnée
Inserer dans ta table "indentité" catégorie: pseudo pass mail etc...

 
VALUES(?,?,?,?,?)",array($pseudo,$passhash,$email,$adresse,$avatar));  Inserer les valeurs (variables) $pseudo,$passhash,$email,$adresse,$avatar

Donc, si tu prêtes attention en rouge dans tes catégories tu as : "mail" et non "email"

EDIT x2: il n'y as pas un soucis avec ton email ? Ah moin vu que tu l'as recopier à l'écrit tu as fait la faute là.. et pas dans ta database... 
bon tant mieux alors ! 
Mes le topic en résolue
fanhmm2

fanhmm2 Le 11 octobre 2019 à 21:42

Salut 😉
Non avec l'email je n'ai pas d'erreur, car mon champ DB se nomme bien "mail" mais comme le nom du champ du formulaire se nomme "email" je poste le nom de ce champ dans le champ de la DB (qui se nomme mail.
Et cela fonctionne bien j'ai l'adresse email saisie dans le formulaire qui s'inscrit bien dans la DB dans le champ DB "mail".
Mon seul problème pour le moment c'est les saisies qui ne s'inscrivent pas dans la db si une des lettres a un accent.
.
Doppler

Doppler Le 11 octobre 2019 à 23:42 (Édité le 11 octobre 2019 à 23:44)

Salut @fanhmm2,
Vérifie l'encodage de ta base de donnée et non celle de la connexion avec PHP.
Tu pourrais la convertir en UTF8mb4 qui pourra également prendre en charge les emojis et accents en plus.

Pour cela, va dans la base PHPmyadmin, sélectionne ta bdd, puis onglet SQL.
Puis saisit le code suivant : 

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Attention ! Pense à sauvegarder ta base de donnée.
Pour cela, sélectionne ta bdd, puis onglet barre du haut "Exporter.

Puis fait bouton enregister.

Tu n'auras, normalement, plus de problèmes.
Retourne moi la réponse ! 😉
fanhmm2

fanhmm2 Le 12 octobre 2019 à 09:22 (Édité le 12 octobre 2019 à 10:11)

Bonjour Doppler 😉
J'ai sauvegardé ma base comme tu m'a dit, c'est super !
Par contre quand j'execute la commande que tu m'as indiqué ça donne l'erreur :
Requête SQL :
database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ciMySQL a répondu: [url=http://localhost/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Ferror-messages-server.html&token=9cfe26be71cfa4d38371f4bf4cbb50b0][/url]
#1064 - Erreur de syntaxe près de 'database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci' à la ligne 1
La commande que j'execute c'est ça :
database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
EDIT : OUPS ! J'ai oublié ALTER BASE ! Quel boulet :/

Ah bein encore Erreur :
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
MySQL a répondu: #1 - Can't create/write to file '.\database_name\db.opt' (Errcode: 2 - No such file or directory)
EDIT : Cette fois c'est bon je pense car il a pas donné d'erreurs, il a juste dit qu'il a effectué l'action avec succès, en fait j'ai mis le nom de la base à la place du mot "database_name" mais quand je regarde la structure des tables je vois que les collations n'ont pas changés.

Sur le site que j'ai donné en lien :
comment-resoudre-les-problemes-daccents
Ils proposent "UTF8_general_ci" j'avais donc mis hier ma table identité à cette collation, mais bon ça n'avait rien changé hier à mon problème d'accents.

J'ai essayé encore deux fois avec ce code :
ALTER DATABASE membres CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
ça marche mais ça ne change pas la collation des tables, et pas d'erreur indiquée :/

est-ce que c'est dû au fait que j'ai pas encore remplacé wamp ? par Xamp que j'ai téléchargé.
Doppler

Doppler Le 12 octobre 2019 à 11:51 (Édité le 12 octobre 2019 à 11:54)

Re;

Attention ! "database_name " correspond au nom de ta base de donnée !!! vérifie bien cela !
Par ailleurs, peut tu me communiquer une capture d'écran de ton rendu de ta page php et la page PHPmyAdmin avec ta bdd ?
fanhmm2

fanhmm2 Le 13 octobre 2019 à 03:25

Salut Doppler, c'est quoi le rendu de ma page PHP ?
Je fait printscreen pour coller une image de la table DB mais paint ne colle rien.
fanhmm2

fanhmm2 Le 14 octobre 2019 à 01:36 (Édité le 14 octobre 2019 à 03:39)

Salut 😉
Le site est devenu fantôme ou bien vous êtes tous occupés ces jours-ci ?
En tous cas je vous salut que vous soyez fantômes ou pas 😉
J'ai installé XAMP (enfin) et j'ai mis les champs de toutes mes tables à la collation "UTF8mb4_general_ci" mais cela n'a rien changé concernant l'impossibilité d'enregistrer en BDD les phrases dont une lettre possède un accent.
J'ai enfin trouvé la solution ! c'est moi qui a fait l'idiot, j'ai oublié de mettre la balise meta charset UTF8 dans la page formulaire HTML (inscription.html) !
Alexandre1995

Alexandre1995 Le 14 octobre 2019 à 13:36

@fanhmm2 Escuse-moi du temps de retard, mais je te souhaite bravo pour ton problème résolue 
peux tu indiquer ton dernier commentaire en "meilleur réponse""? 

@Doppler Salut, peux-tu regarder ta boite-mail s'il te plaît celle qui correspond à celle de Youtube ? 
Merci, et tant pis si tu ne peux pas. 

Sur ce Bye !
Meilleure réponse
Doppler

Doppler Le 14 octobre 2019 à 18:59

Salut @Alexandre1995;

Avec plaisir, mais de quelle chaîne YouTube parles-tu ?
Je n'ai reçu aucun mail de ta part...
fanhmm2

fanhmm2 Le 16 octobre 2019 à 15:47

Merci pour vos aides 😉
J'ai marqué mon dernier post en meilleure réponse comme tu as demandé Alexandre !