Voilà je me tourne vers vous tous (complètement désespéré et à un peu à bout de nerf aussi ^^) après 3 jours de galère sur deux gros problèmes.
Etant en formation sur le site, je dois créer un intranet pour le GBAF, je galère à trouver des solutions. J'ai passé en revue mon code, tester pleins d'alternatives, consulté des sites ou des vidéos en espérant trouver le problème moi-même mais sur ma page d'inscription je me trimballe toujours le même problème le fameux "Parse error: syntax error, unexpected 'else' (T_ELSE) in C:\wamp64\www\test\GBAF\inscription_post.php on line 45 "
Impossible de trouver la solution malgré une ré-écriture complète du code et en essayant de le rendre clair j'arrive toujours pas à voir où j'ai merdé Je vous donne donc le code php de la page servant à exécuter les script nommé "inscription_post.php" :
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=espace_membre', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
die('Erreur' .$e-> getMessage());
}
if(isset($_POST['forminscription']))
{
if(!empty($_POST['nom']) AND !empty($_POST['prenom']) AND !empty($_POST['pseudo']) AND !empty($_POST['password']) AND !empty($_POST['question']) AND !empty($_POST['reponse']))
{
$pseudolenght = strlen($pseudo);
$nom = htmlspecialchars($_POST['nom']);
$prenom = htmlspecialchars($_POST['prenom']);
$pseudo = htmlspecialchars($_POST['pseudo']);
$password = password_hash(($_POST['password']), PASSWORD_DEFAULT);
$question = htmlspecialchars($_POST['question']);
$reponse = htmlspecialchars($_POST['reponse']);
if($pseudolenght <= 255)
{
$insert_membre = $bdd->prepare("INSERT INTO membre(nom, prenom, pseudo, password, question, reponse) VALUES(:nom, :prenom, :pseudo, :password, :question, :reponse)");
$insert_membre->execute(array($nom, $prenom, $pseudo, $password, $question, $reponse));
$erreur = "Votre compte a bien été crée!";
}
else
{
$erreur = "Votre pseudo ne doit pas dépasser 255 caractères!";
}
else
{
$erreur = "Tous les champs doivent être remplis!";
}
}
}
?>
et du coup la page d'inscription du site contenant le HTML, nommé 'inscription.php'
Au moins où j'en suis je me permets de vous partager aussi le problème avec ma page de connexion avec laquelle j'ai deux erreurs qui s'affiche qui sont: Undefined variable: pseudo in C:\wamp64\www\test\GBAF\connexion_post.php on line 17
et: Notice: Undefined index: password in C:\wamp64\www\test\GBAF\connexion_post.php on line 21
Je vous mets égalements les codes des pages. D'abord connexion_post.php '
<?php
session_start();
try
{
$bdd = new PDO('mysql:host=localhost;dbname=espace_membre', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch (Exception $e)
{
die('Erreur : '. $e->getMessage());
}
$req = $bdd->prepare('SELECT id, password FROM membres WHERE pseudo = :pseudo');
$req->execute(array(
'pseudo' => $pseudo));
$resultat = $req->fetch();
$isPassCorrect = password_verify($_POST['password'] , $resultat['password']);
if(!$resultat)
{
$erreur = 'Mauvais identifiant ou mot de passe!';
}
else
{
if($isPassCorrect) {
session_start();
$_SESSION['id'] = $resultat['id'];
$_SESSION['pseudo'] = $pseudo;
$erreur = 'Vous êtes connecté !';
header('Location: tableau.php');
}
else {
$erreur = 'Mauvais identifiant ou mot de passe!';
}
}
?>
La variable pseudo à la ligne 17 est celle venant de la ligne 15 puisque je parle du pseudo dans la base de donnée... c'est censé compté non? en plus c'est le même nom donné sur le code HTML pour éviter toute confusion... idem pour "pseudo...
Sinon Aurélien j'applique le htmlspecialchars comme il est conseillé dans le cours. Après pour ta remarque sur la requete mal préparée un l'insertion se sèche un peu.
C'est là qu'on voit tout l'amateurisme de mon code pourtant je me suis beaucoup appuyé sur le cours et d'autres sujets résolu du forum
Merci de vos réponses en tout cas
- Edité par BenoîtPerussel 13 janvier 2021 à 13:22:29
Sinon Aurélien j'applique le htmlspecialchars comme il est conseillé dans le cours.
A moins que ça ait changé depuis (car j'avais vérifié une fois quand un autre membre soutenait mordicus que c'était le cas), il n'est jamais dit dans le cours que cela doit être utilisé avant d'envoyer les données dans la base, et si cela venait à changer, il y aurait des voix pour condamner cette manière de faire dans un tutoriel connu.
Même sans cela, ne pas confondre faille par injection SQL et faille XSS.
Sinon Aurélien j'applique le htmlspecialchars comme il est conseillé dans le cours.
A moins que ça ait changé depuis (car j'avais vérifié une fois quand un autre membre soutenait mordicus que c'était le cas), il n'est jamais dit dans le cours que cela doit être utilisé avant d'envoyer les données dans la base. Ne pas confondre faille par injection SQL et faille XSS.
Effectivement tu as raison, je peux donc enlever le htmlspecialchars et garde juste le password_hash du coup?
Mais je suis pas sûr que cela résoudra l'erreur...
Oh là oh là ... j'ai l'impression qu'il y a micmac !
En ligne 17 tu indiques que tu vas faire une sélection sur le pseudo dans ta base de données avec la valeur contenue dans la variable $pseudo : certes ! mais je le redis qu'elle est la valeur de la variable $pseudo. Donc fait juste avant un simple var_dump($pseudo) et tu verras si tu as une valeur.
Oh là oh là ... j'ai l'impression qu'il y a micmac !
En ligne 17 tu indiques que tu vas faire une sélection sur le pseudo dans ta base de données avec la valeur contenue dans la variable $pseudo : certes ! mais je le redis qu'elle est la valeur de la variable $pseudo. Donc fait juste avant un simple var_dump($pseudo) et tu verras si tu as une valeur.
Pas de réponse sur la suggestion elseif ?
A+
J'ai essayé avec le eslif et ç n'a pas l'air de cgangé grand chose... j'ai toujours autant d'erreurs... je suis désespéré je comprends ni pourquoi ni ou ni comment j'ai merdé... j'ai passé des heures entières à rectifié et essayé et même avec var_dump... enfin je progresse pas du tout... je tourne en rond et ça m'énerve... je commence à être à cours de temps et d'option.. je sais pas quoi faire...
Donc il y a eu du mieux mais pour la page "inscription_post" soit j'ai un message d'erreur avec les ligne 27 et 28 mais en réessayant deux minutes avant mon poste, il y a eu simplement une page blanche, j'ignore ce changement.. j'ai l'impression que c'est aux jets de dés que ça se joue. ^^ Et du coup en testant une inscription, la page "inscription.php charge mais me redirige vers la page "inscription_post.php" au lieu de m'amener à la page connexion (et l'inscription est pas prise en compte, j'ai regardé la base de donnée.) Donc même s'il y a eu une progression je comprends toujours pas pourqoi les pages communiques pas entre elle (seule la page deconnexion fait bien son boulot mais les autres font de la dissidence.
EN tout cas je vous remercie déjà pour votre aide et je te remercie monkey3d pour ta patience si vous voulez que je poste mes codes autres pages je peux
Rassure moi quand tu fais un var_dump(), tu mets bien une variable à l'intérieure style var_dump($ma_variable); ????
Et si tu as des erreurs comme tu le dis, tu pourrais les mettre dans le post ?
Et si var_dump te donne rien en ayant mis une variable c'est que ta variable est vide. Ce qui est déjà une bonne information.
Alors je commercerai pas vérifier ce que donne les variables post dans le script d'inscription ? je vérifierai si c'est ok ensuite le retour de la base de données, etc.
C'est la manière courante et systématique de tester et debugger un programme : on procède par étapes et surtout ... on ne change pas tout en même temps.
Je note que tu n'as toujours pas enlevé htmlspecialchars() comme il te l'a été vivement conseillé… ou/et tu n'es pas allé lire le lien que j'avais fourni, tu n'aurais pas demandé si tu devais l'enlever.
Je note que tu n'as toujours pas enlevé htmlspecialchars() comme il te l'a été vivement conseillé… ou/et tu n'es pas allé lire le lien que j'avais fourni, tu n'aurais pas demandé si tu devais l'enlever.
Et bien je laissais par reflexe ... mais c'est pas ça qui me cause des erreur donc je l'ai laissé un peu bêtement.
monkey3d a écrit:
Rassure moi quand tu fais un var_dump(), tu mets bien une variable à l'intérieure style var_dump($ma_variable); ????
Et si tu as des erreurs comme tu le dis, tu pourrais les mettre dans le post ?
Et si var_dump te donne rien en ayant mis une variable c'est que ta variable est vide. Ce qui est déjà une bonne information.
Alors je commercerai pas vérifier ce que donne les variables post dans le script d'inscription ? je vérifierai si c'est ok ensuite le retour de la base de données, etc.
C'est la manière courante et systématique de tester et debugger un programme : on procède par étapes et surtout ... on ne change pas tout en même temps.
A+
Oui evidement je mettais une variable dans _var_dump mais ma page restait blanche donc j'ignore si c'est parce qu'elle est vide ou parce que wamp n'actualise pas correctement (il m'avait déjà causé un souci de ce genre une fois) D'accord donc je recommence et j'y vais petit à petit c'est ça? et je rajoute mon script au fur et à mesure?
En fait quand je fais remplis le formulaire d'inscription j'appuie sur le bouton pour s'inscrire. Sauf qu'au lieu de valider l'inscription et me renvoyer sur la page "connexion.php" j'atterris sur la page inscription_post.php" qui s'avère pour le coup être blanche....
EDIT:
Le problème a évolué. J'ai aucun problème à intéragir avec ma base de donnée avant d'ecrire le scirpt php de la page d'inscription. Aucune erreur ne s'affiche. Cependant quand je tente une inscription, celle-ci n'est pas prise en compte et je reste sur la page inscription (avec un message d'erreur dans l'url indiquant une erreur mais ça c'est moi qui l'est mis: "header: Location: inscription.php?reg_err=error_script" )
En fait quand j'appuie sur le bouton pour valider le formulaire il se passe rien et en regardant dans la base de données le membre n'apparait pas.... donc on avance mais malheureusement je suis encore bloqué avec la validation. J'ai à peine touché au script, j'ai enlevé le "htmlspecialchars" et cela n'a rien changé ^^ (en le remettant non plus d'ailleurs) mais tout le reste du formulaire est le même. J'ai éteint et rallumé Wamp juste au cas où mais rien non plus... quelqu'un a une solution?
Est-ce que changer <input/> par <button> changerai quelque chose?
- Edité par BenoîtPerussel 17 janvier 2021 à 3:24:48
Mets en commentaire toute les redirections sur inscription_post comme cela s'il va des erreurs elles devrais s'afficher à condition de les avoir activé (cf Faq php)
Ensuite reposte le code de dernier avec les demandes que nous avons fait
Après le var_dump, tu peux aussi ajouter un exit si tu ne vois pas les traces.
Je ne pense pas que changer input par button serait la solution.
Quand tu valides ton formulaire, arrives tu dans ton script d'inscription ? ... debuggage progressif ...
A+
Alors après des modifications et avec les instruction de mon mentor je suis parvenu effectivement à aller sur la page inscription_post.php. (désolé pour le "htmlspecialchars" encore une fois mais il me l'a présenté ainsi j'ai donc retravaillé le code avec sa base.) donc je valide et le nom que j'ai rentré apparaît maiiiiiiiiis toujours suivi d'un undefined index password... et je comprends toujours pas pourquoi non plus... j'ai l'impression que je vais jamais en voir le bout. (Calude est le nom erntré au hasard dans le formulaire ^^)
<?php
$bdd = new PDO('mysql:host=localhost;dbname=espace_membre', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
if(isset($_POST['forminscription'])) {
echo $_POST['nom'];
if(!empty($_POST['nom'])) {
$nom = htmlspecialchars($_POST['nom']);
$prenom = htmlspecialchars($_POST['prenom']);
$pseudo = htmlspecialchars($_POST['pseudo']);
$pseudolenght = strlen($pseudo);
$password = htmlspecialchars($_POST['password']);
$question = htmlspecialchars($_POST['question']);
$reponse = htmlspecialchars($_POST['reponse']);
if($pseudolenght <= 255) {
$insert_membre = $bdd->prepare("INSERT INTO membres(nom, prenom, pseudo, password, question, reponse) VALUES(?, ?, ?, ?, ?, ?)");
$insert_membre->execute(array($nom, $prenom, $pseudo, $password, $question, $reponse));
$erreur = "Votre compte a bien été crée!";
} else {
$erreur = "Votre pseudo ne doit pas dépasser 255 caractères!";
}
} else {
$erreur = "Tous les champs doivent être remplis!";
}
}
?>
ET voila le code retravaillé avec mon mentor (l'indentation c'est son choix...) j'ai retravaillé les echos voir même enelver et mis les message "$erreur" dans un premier temps avant de m'embarquer dans une redirection de page. et après avoir ajouter le var_dump, voilà à quoi j'ai droit à :
Je vais jamais m'en sortir et la fin de la formation approche... Je vois pas en quoi c'est une erreur de syntaxe en plus ^^
Mais quand je remplis le formulaire cela créer bien le compte dans la base de donnée. Mais il apparait deux fois... et dans la table, les infos apparaissent sauf le mot de passe..
Pour le htmlspecialchar, tu peux lui faire lire la page dans ma signature.
Ensuite sur le formulaire de login, il manque les " autour du name "password"
Tu as écrit "passeword" dans ton formulaire.
Un var_dump de $_POST pour vérifier que tu obtiens bien les donner voulu
D'accord je lui dirai (sans te citer) et avec le lien envoyé.
Oui c'était une bourde que j'avais déjà corrigé.
Du coup bonne nouvelle la page inscription marche et l'inscription est prise en compte dans la base de données! Mais une fois que je suis la page connexion je me prend un fatal error et une PDOexception sur la même ligne qui est la ligne 21... et là je comprends pas vu qu'il s'agit d'un array et il me semble que la bonne variable soit entrée:
Quand tu as une erreur ce serait bien de la transmettre dans ton post avec le message d'origine et non nous en faire un résumé incomplet.
Dans le cas, la connexion est-elle bien établie ? $pseudo contient bien ce que tu attends (vérifié) ? enlève la virgule derrière password.
A+
- Edité par monkey3d il y a environ 9 heures
Voilà du coup pour les messages d'erreurs
A quel 'password"? si c'est celui de la ligne 20 quand je l'enlève je suis redirigé sur ma page d'inscription quand je veux valider mes identifiants...
- Edité par BenoîtPerussel 18 janvier 2021 à 15:54:18
Ok pour le message et en supposant que la ligne 21 est toujours celle de l'instruction execute.
Mes autres questions en suspend :
Dans le cas, la connexion est-elle bien établie ? $pseudo contient bien ce que tu attends (vérifié) ? enlève la virgule derrière password.
A+
La connexion est bien établie avec un "echo" on s'en rend compte!
Alors pour la virgule si je l'enlève, quand je tape les identifiants de connexion et que je valide, je tombe sur la page d'inscription... si je la remets je retombe sur les messages d'erreur avec le pseudo affiché juste avant (car comme je l'ai dit j'ai mis un echo pour savoir si la valeur existe et est prise en compte.)
- Edité par BenoîtPerussel 19 janvier 2021 à 10:01:22
Donc la virgule pose bien problème. A enlever comme je te le disais depuis quelques post.
Ligne 23 fais un var_dump($data) et dis nous ce que tu trouves ... et je parie que la valeur entraîne la partie else de ton if.
A+
Et bien figure qu'en en elevant la virgule et en faisant un " var_dump($data) " (sans point-virgule après) j'ai l'erreur suivante:Qui correspond donc à: " $data = $check->fetch(); "
On parle bien de la virgule après password dans la requête ligne 20 du code fourni précédemment ? Parce que pour l'instant et d'après le code fourni, c'est assez certain que si cette virgule reste, la requête va planter.
On parle bien de la virgule après password dans la requête ligne 20 du code fourni précédemment ? Parce que pour l'instant et d'après le code fourni, c'est assez certain que si cette virgule reste, la requête va planter.
Donc la virgule pose bien problème. A enlever comme je te le disais depuis quelques post.
Ligne 23 fais un var_dump($data) et dis nous ce que tu trouves ... et je parie que la valeur entraîne la partie else de ton if.
A+
Alors j'ai tout simplement ré-écrit le code et je me suis appuyé sur tes conseils et ceux des autre et visiblement... ça marche! Pas de virgule qui m'embete et j'atterris bien où je l'ai demandé !!! Je me suis embourbé dans un merdier sans nom et grâce à toi et aux autres cela marche! je sais pas trop comment mais j'ai enlevé des choses dans le code remodifer certaines lignes et visiblement le php s'exécute!
JE VOUS REMERCIE INFINIMENT! Monkey3d je te remercie tout particulièrement! j'ai enfin résolu le problème! Je vous suis très reconnaissant!
(j'espère que ça recommencera pas parce que là j'abandonnerai je pense )
Gros problèmes pages: 'inscription' et 'connexion'
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP