Données formulaire qui ne s'inscrivent pas dans la BDD
- Accueil
- Forum
- Programmation
- PHP
- Données formulaire qui ne s'inscrivent pas dans la BDD
fanhmm2 Le 10 octobre 2019 à 21:43 (Édité le 14 octobre 2019 à 03:39)
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 Le 14 octobre 2019 à 13:36 (Édité le 1 janvier 1970 à 01:00)
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 !
fanhmm2 Le 10 octobre 2019 à 21:46 (Édité le 10 octobre 2019 à 22:35)
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 Le 11 octobre 2019 à 05:35 (Édité le 1 janvier 1970 à 01:00)
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 Le 11 octobre 2019 à 08:44 (Édité le 1 janvier 1970 à 01:00)
Alexandre1995 Le 11 octobre 2019 à 08:46 (Édité le 1 janvier 1970 à 01:00)
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 Le 11 octobre 2019 à 12:29 (Édité le 11 octobre 2019 à 12:30)
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 Le 11 octobre 2019 à 12:36 (Édité le 1 janvier 1970 à 01:00)
fanhmm2 Le 11 octobre 2019 à 12:52 (Édité le 11 octobre 2019 à 13:44)
"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 Le 11 octobre 2019 à 13:46 (Édité le 1 janvier 1970 à 01:00)
fanhmm2 Le 11 octobre 2019 à 14:02 (Édité le 11 octobre 2019 à 14:04)
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 Le 11 octobre 2019 à 15:06 (Édité le 11 octobre 2019 à 15:08)
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 Le 11 octobre 2019 à 15:12 (Édité le 11 octobre 2019 à 15:19)
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 Le 11 octobre 2019 à 17:44 (Édité le 11 octobre 2019 à 17:53)
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 Le 11 octobre 2019 à 18:02 (Édité le 11 octobre 2019 à 18:09)
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 Le 11 octobre 2019 à 18:21 (Édité le 11 octobre 2019 à 19:19)
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 Le 11 octobre 2019 à 19:40 (Édité le 11 octobre 2019 à 20:33)
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 Le 11 octobre 2019 à 21:42 (Édité le 1 janvier 1970 à 01:00)
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 Le 11 octobre 2019 à 23:42 (Édité le 11 octobre 2019 à 23:44)
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 Le 12 octobre 2019 à 09:22 (Édité le 12 octobre 2019 à 10:11)
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 Le 12 octobre 2019 à 11:51 (Édité le 12 octobre 2019 à 11:54)
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 Le 13 octobre 2019 à 03:25 (Édité le 1 janvier 1970 à 01:00)
Je fait printscreen pour coller une image de la table DB mais paint ne colle rien.
fanhmm2 Le 14 octobre 2019 à 01:36 (Édité le 14 octobre 2019 à 03:39)
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 Le 14 octobre 2019 à 13:36 (Édité le 1 janvier 1970 à 01:00)
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 !
Doppler Le 14 octobre 2019 à 18:59 (Édité le 1 janvier 1970 à 01:00)
Avec plaisir, mais de quelle chaîne YouTube parles-tu ?
Je n'ai reçu aucun mail de ta part...
fanhmm2 Le 16 octobre 2019 à 15:47 (Édité le 1 janvier 1970 à 01:00)
J'ai marqué mon dernier post en meilleure réponse comme tu as demandé Alexandre !