Il s'agit d'un site internet d'inscription en tant que bénévole. L'inscription remplis la BDD et permet de créer un compte utilisateur pour que ce dernier puisse changer les infos s'il le souhaite.
J'ai retravaillé le formulaire d'inscription, et je voulais adapter mes modifications sur les fonctions d'insertion dans la base de données. Mais voilà, je m'y perds un peu sur le code utilisé. Surtout au niveau des noms des champs.
Je ne sais pas si à un endroit il s'agit des champs que j'ai mis dans ma BDD, si à un autre c'est le name de l'input que j'ai dans mon formulaire, pour faire le lien ...
Je mélange un peu tout et malgré mes recherches, comme il y a pas mal de fonctionnalités mélangées au même endroit, j'en suis un peu au point mort. J'aurais donc besoin d'explications s'il vous plait, en me disant " A tel endroit le nom auquel tu fais référence c'est celui-là, parce que ...".
A l'heure actuelle, si je remplis le formulaire d'inscriprion, je suis renvoyé sur ma page d'accueil. Comportement étrange, car en cas d'erreur, le site est censé m'afficher à nouveau la page d'inscription avec les messages d'erreurs, et en cas de réussite il doit renvoyer sur la page de remerciement. Il ne fait rien de cela, et l'insertion en BDD forcément ne fonctionne pas.
Je vous en remercie par avance pour vos lumières qui me permettrons de mieux comprendre ce code !
Voici mon code, je n'ai mis que 5 de mes champs à chaque fois, pour ne pas surcharger :
Le formulaire :
<?php
$title = 'Inscription';
ob_start();
?>
<fieldset>
<div class="container10">
<div class="heading">
<h2 id="hInscription">Formulaire d'inscription</h2>
<div class="info">
<p id="introFormInscription"> Paragraphe de présentation .... </p>
<?php
if(isset($_SESSION['erreur'])){// si y a une erreur je rentre dans la boucle
for($i=0; $i< sizeof($_SESSION["erreur"]);$i++){
echo'<font color="red">'. $_SESSION['erreur'][$i].'<br>'."</font>";
};
unset($_SESSION['erreur']);
}
?>
</div>
</div>
<form class="form-row needs-validation" action="index.php" method="POST" id="contact-form">
<div class="col-12 form-group-cadreSection"> <!-- ma ligne de début section -->
<div class="form-group-cadreNomSection">Création compte bénévole</div> <!-- ma ligne titre section -->
<div class="col-12 form-group"> <!-- EMAIL -->
<label id="email" for="emailinput">Email<span class="etoile">*</span> </label>
<input type="email" id="emailinput" class="form-control" name="emailinput" placeholder="Entrez une adresse mail" value="<?php if(isset($emailinput)) { echo $emailinput; } ?>" required />
<small id="emailAide" class="form-text">Saisissez une adresse email valide, elle vous servira d'identifiant pour votre compte bénévole</small>
<div class="valid-feedback"> </div>
</div>
<div class="col-12 form-group"> <!-- MDP -->
<label id="password" for="passwordinput">Mot de passe<span class="etoile">*</span> </label>
<input type="password" id="passwordinput" class="form-control" name="passwordinput" placeholder="Entrez un mot de passe" required minlength="6"/>
</div>
</div> <!-- ma ligne de fin de section -->
<div class="col-12 form-group-cadreSection"> <!-- ma ligne de début section -->
<div class="form-group-cadreNomSection">Identité</div> <!-- ma ligne titre section -->
<div class="col-12 form-group"> <!-- GENRE -->
<label id="genre" for="genreselect">Genre<span class="etoile">*</span></label>
<select id="genreselect" class="form-control" name="genreselect" required >
<option name="genre"></option>
<option value="femme">Femme</option >
<option value="homme">Homme</option >
<option value="indefini">Je ne souhaite pas le préciser</option>
</select>
</div>
<div class="col-12 form-group"> <!-- NOM -->
<label id="nom" for="nominput">Nom<span class="etoile">*</span></label>
<input id="nominput" class="form-control" name="nominput" placeholder="Entrez votre Nom" value="<?php if(isset($nominput)) { echo $nominput; } ?>" required pattern="^[A-Za-z '-]+$"/>
</div>
</div> <!-- ma ligne de fin de section -->
<div class="col-12 form-group-cadreSection"> <!-- ma ligne de début section -->
<div class="form-group-cadreNomSection">Présence</div> <!-- ma ligne titre section -->
<div class="col-12 form-check"> <!-- JOURS PRESENCE -->
<p class ="jourPresence">Jour de presence<span class="etoile">*</span></p>
<?php
$semaine=['Lundi' => 21,'Mardi' => 22,'Mercredi'=> 23, 'Jeudi'=> 24, 'Vendredi'=> 25, 'Samedi'=> 26, 'Dimanche'=> 27,'Lundi '=> 28,'Mardi '=> 29];
asort($semaine);
foreach ($semaine as $key => $date){
?>
<label id="jourPresenceLabel">
<input type="checkbox" id="jourPresencecheckbox" class="form-check-input" name="jourPresencecheckbox" value="<?php echo $date; ?>"/>
<?php echo $key . ' ' .$date ; ?>
</label></br>
<?php
}
?>
</div>
</div> <!-- ma ligne de fin de section -->
<!-- BOUTONS class lesboutons -->
<div class="col-12 form-group">
<div class="lesboutons">
<button type="submit" id="boutonEnvoyerInscription" name="boutonEnvoyerInscription" value="1">Envoyer</button>
<button type="reset" id="boutonEffacerInscription" name="boutonEffacerInscription" value="Effacer">Effacer</button>
</div>
</div>
</form>
</div>
</fieldset>
</html>
<?php
$content = ob_get_clean();
require 'views/template.php';
?>
Connexion à la BDD :
<?php
function connect(){// se connecter à notre base de donées
try {
$bdd = new PDO('mysql:host=localhost;dbname=meeting_aerien;charset=utf8','pma','motdepass!!!');
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
return $bdd;
}
Code Préparation de l'envoi en BDD, gestion des erreurs et de la connexion utilisateur
<?php
ob_start();
function formulaireRempli(){
if(getErrors()) return header('Location:index.php?inscrire=inscrire');//si y'a une erreur je réaffiche le formulaire d'inscription
$data = prepareData();
$bdd = connect();
$request = $bdd->prepare(//je prépare la 1er requête d'insertion dans la table utilisateur
'INSERT INTO utilisateurs (id_type_utilisateur,email_utilisateur,mdp_utilisateur,genre,nom_utilisateur)
VALUES(2,:email,:mdp,:genre,:nom)'//"now"= affiche automatiqument la date du jour dans la table utilisateurs
);
$request->execute([ //j'éxecute la requête
':email' => $data['emailinput'],
':mdp' => password_hash($data['passwordinput'], PASSWORD_DEFAULT),
':genre' => $data['genreselect'],
':nom' => $data['nominput'],
]);
if($jourPresence = 21){
foreach($data['jourPresenceLabel'] as $jourPresence){
switch ($jourPresence) {
case '21': $date = 1; break;
case '22': $date = 2; break;
case '23': $date = 3; break;
case '24': $date = 4; break;
case '25': $date = 5; break;
case '26': $date = 6; break;
case '27': $date = 7; break;
case '28': $date = 8; break;
case '29': $date = 9; break;
default:
}
$request2 =$bdd->prepare('INSERT INTO cocher (id_date, id_utilisateur) VALUES(:id_date,LAST_INSERT_ID())');
$request2->execute([':id_date' => $date ]);
}
}
return header('Location:views/frontend/remerciement.php');exit();
}//fin fonction formulaireRempli
function prepareData() {//on simplifier nos variables
// Sécurisation du formulaire
$email = trim(htmlspecialchars($_POST['emailinput']));
$password = trim(htmlspecialchars($_POST['passwordinput']));
$genre = trim(htmlspecialchars($_POST['genreselect']));
$nom= trim(htmlspecialchars($_POST['nominput']));
$jourPresence=($_POST["jourPresenceLabel"]);
return [
'emailinput' => $email,
'passwordinput'=>$password,
'genreselect' => $genre,
'nominput' => $nom,
'jourPresenceLabel'=> $jourPresence,
];
}
function getErrors() {
$error =false;
$_SESSION["erreur"] = [];
//vérifier si tous les champs sont remplis
if( empty($_POST['emailinput']) ||
empty($_POST['passwordinput']) ||
empty($_POST['genreselect']) ||
empty($_POST['nominput']) ||
empty($_POST['jourPresenceLabel'])||
{
$_SESSION['erreur'][] = "Tous les champs obligatoires(*) doivent être complétés !";
$error = true;
}
// verifier le format de email
if(!filter_var($_POST['emailinput'], FILTER_VALIDATE_EMAIL)){
$_SESSION['erreur'][] = "Votre email n'est pas valide, veuillez entrer une adresse mail correcte !";
$error = true;
}
// verifier la taille de email
if(strlen($_POST['emailinput']) > 50){
$_SESSION['erreur'][] = "Votre email ne doit pas dépasser 50 caractères !";
$error = true;
}
//verifier si l'email existe déjà
$bdd = connect();
$reqemail = $bdd -> prepare("SELECT * FROM utilisateurs WHERE email_utilisateur = ?");
$reqemail-> execute(array(htmlspecialchars(strip_tags($_POST['emailinput']))));
$emailexist= $reqemail->rowCount();
if($emailexist == 1){
// $_SESSION['erreur'][] = "email déjà utilisé !" ;//j'ai stocker mes messages d'erreur dans une variavle session
$_SESSION['erreur'][] = "Votre email est déjà utilisé ! Veuillez vous connecter sur votre compte bénévole
<a href='/site_association/index.php?email=connexion' <span class='emailutilise'><strong>: SE CONNECTER
</strong></span></a> ou saisir une autre adresse mail.";
$error = true;
}
//On verifie si le mot de passe à 6 caractères ou plus
if(strlen($_POST['passwordinput'])<=6 OR strlen($_POST['passwordinput'])>=255){
$_SESSION['erreur'] [] = "La taille du mot de passe doit être au moins de 6 caractères !";
$error = true;
}
//vérifier la taille de "nom"
if(strlen($_POST['nominput'])<=2 OR strlen($_POST['nominput'])>=50){
$_SESSION['erreur'][] = "Votre nom doit comporter entre 2 et 50 caractères !";
$error = true;
}
if(!$error){//si y a pas d'erreur on detruit la variable $_session
unset($_SESSION["erreur"]);
}
return $error;
}//fin de la function getErrors
//--------------------traitement "se connecter"------------------
function getUser(){
$bdd = connect();
//Récupération de l'utilisateur et de son mot de passe hashé
$req = $bdd->prepare('SELECT id_utilisateur, mdp_utilisateur FROM utilisateurs WHERE email_utilisateur = :emailconnect');
$emailconnect = $_POST['emailconnect'];
$req->execute(array(
'emailconnect' => $emailconnect));
$resultat = $req->fetch();
// Comparaison du mdp envoyé via le formulaire avec celui de la base de données
$passwordinput = $_POST['passwordinput'];
$isPasswordCorrect = password_verify($_POST['passwordinput'], $resultat['mdp_utilisateur']);
if(!$resultat)
{
echo 'Mauvais identifiant ou mot de passe !';
}
else
{
if($isPasswordCorrect) { $_SESSION = array();
session_start();
$_SESSION['connect'] = true;
$_SESSION['id_utilisateur'] = $resultat['id_utilisateur'];
$_SESSION['email_utilisateur'] = $emailconnect;
$_SESSION['prenom_utilisateur'] = $prenom;
header("Location:/views/frontend/page_benevole.php?=". $_SESSION['id_utilisateur']);
}
else {
echo 'Mauvais identifiant ou mot de passe !';
}
}
}//fin de la fonction getUser
?>
<?php
$content = ob_get_clean();
?>
<?php
je n'ai pas tout lu attentivement, mais je peux dire d'ores et déjà qu'à la ligne 19 du dernier code il y a une erreur. Le "=" en php, c'est une assignation, pas une vérification de condition, donc on passe forcément dans le if.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Je vois ce que tu veux dire, mais je pense que celle qui a fait ce code a mis ça exprès, car il faut impérativement rentrer dans cet if. En effet, il traite les cases à cocher qui sont présentes dans le formulaire, et le champ est obligatoire, donc au moins l'une des cases doit être cochée.
Mais en effet, la façon de faire n'est pas propre, je me pencherai sur le sujet. Mais si tu as une suggestion, je suis preneuse !
- Pas de htmlspecialchar sur les données entrée en BDD, c'est que pour l'affichage
- Ton formulaire pointe vers index.php (action=) donc logique que tu y retournes (vu du code) mais tu devrais le diriger vers une page "traitement" ou un truc du genre. Une page qui appelle ta fonction "FormulaireRempli"
- Pour le htmlspecialchar, il me semblait avoir compris cela en effet. Mais j'ai lu aussi que ça permettait de ne pas avoir les caractères spéciaux sous forme bizarre dans la BDD. Du coup, je ne savais pas quoi en faire. Corriges moi si je me trompe s'il te plait, si je fait ce que tu dis, je dois utiliser simplement la syntaxe : $email = $_POST['emailinput'];
- Je vois ce que tu veux dire, mais ça je n'y ai pas touché, cela fonctionnait avant.
Edit :
Bonjour à tous,
Ca y est j'ai trouvé. Je savais que c'était une erreur bête, mais je ne pensais pas à ce point là.
J'avais changé des name sur le formulaire d'inscription pour les rendre plus explicites, pour ne pas les confondre avec d'autres formulaires du site, dont le name du bouton submit à la fin du formulaire d’inscription.
Et je n'avais pas répercuté ce changement sur la page index.php qui fait appel aux différentes fonctionnalités de mon site internet. Donc forcément que tout le reste ne pouvais pas marcher (insertion en BDD, affichage de la page de remerciement, affichage du message d'erreur en cas d'erreur).
Fichier index.php
<?php
session_start();
require_once 'controller/frontend.php';//inclure le fichier qui contient toutes les fonctions
if(isset($_GET['contact'])){//vérifier si la page de contact est demandé
displaypage();//appel de fonction qui affiche la page de contact
}else if(isset($_GET['inscrire'])){//vérifier si la page d'inscription est demandé
displayinscrire();//appl de fonction qui affiche la page d'inscription grace a la fonction displayinscrire
}
[...]
else if(isset($_POST['boutonEnvoyerInscription'])){
displayFormRempli();//appel de fonction qui affiche la page de remerciement
}
else {
displayMenu();
}
Je vous remercie de tous vos messages qui m'ont permis de compléter mes connaissances.
Bonne continuation à vous !
- Edité par EllyWill 7 avril 2020 à 20:20:34
Compréhension de PrepareData / execute ...
× 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