[résolu] Section membre
problème lors de soumission (Reload)
Discussions Générales
Forensic Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre Forensic
- Inscrit le : 18/12/2006
La section membre que j'ai créée pour mon site est up et fonctionnelle. Lorsque le formulaire est soumis, accepté (après vérification de celui-ci), enregistré dans MySQL et affiché le message de remerciement sur la même page que le formulaire, si l'utilisateur rafraichi cette même page de remerciement reload le script entier. Ce qui signifie que les données qui ont été enregistrées sont enregistrées à nouveau. Évidemment, lors de l'étape de vérification, je vérifie si le pseudo et/ou email sont présents dans la base de données. J'ai rajouté exit; à la fin de l'enregistrement et les messages d'erreurs pseudo/email présents s'affichent, mais les données s'enregistrent quand même dans la base de données.
Selon vous, quelle méthode utiliseriez-vous pour régler ce problème? Je cherche depuis quelques jours et je ne vois pas. J'ai tenté d'afficher le message de remerciement sur une page distincte que celle du formulaire, mais le problème survient à nouveau si l'utilisateur clique sur précédent de son navigateur.
Merci pour toutes solutions apportées.
Bonne journée!
Forensic
Édité par Forensic Le 11/03/2007 à 19h42
Chercher sur le forum - /Consulter la Documentation - Consulter la Foire aux Questions (FAQ)
Dire bonjour et merci, c'est toujours apprécié et pensez à mettre vos messages en Réglé!
ben.popeye Membre non connecté
-
Modérateur
- Voir le profil du membre ben.popeye
- Inscrit le : 04/08/2005
- Site internet
- Groupes :
-
Equipe Historique
Un problème, une question ? Cherchez dans la FAQ ou la documentation. Si vous ne trouvez pas la réponse, demandez du support sur le forum.
Bjarne Stroustrup, inventeur du C++ :"There are two ways to write error-free programs; only the third works."
Forensic Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre Forensic
- Inscrit le : 18/12/2006
Je suis amateur auto-didacte, il est alors possible qu'il y ait des manques ou des trous de sécurité, alors en prendre note sera apprécié.
Voici le code complet pour du traitement du formulaire
[code]<?php
session_start();
ob_start();
include "fichiers/begin.php";
$template = new Template('templates');
if (isset($sesMembre) && isset($sesType)) {
header('Location: index.php');
}
else {
$IdentMenu = 'IdentMenu/IdentMenu.tpl';
}
// On va chercher les régions pour le champs ville du formulaire
$rconnect = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die('Erreur lors de la connection à la base de données: '. mysql_error());
$rdb = mysql_select_db($cfgBase, $rconnect) or die('Erreur lors de la sélection de la base de données: '. mysql_error());
$regreq = "SELECT vid,regions FROM bce_villes ORDER BY vid";
$regres = mysql_query($regreq) or die('Erreur lors de la sélection des données: '. mysql_error());
while($regrow = mysql_fetch_array($regres)) {
$template->assign_block_vars('regions', array(
'RID' => $regrow['vid'],
'REGIONS' => htmlentities($regrow['regions'])
));
mysql_close($rconnect);
}
$template->set_filenames(array(
'Doctype' => 'DoctypeInscription.tpl',
'IdentMenu' => $IdentMenu,
'Footer' => 'Footer.tpl',
'TopMenu' => 'TopMenu/TopMenu.tpl',
'RightMenu' => 'RightMenu.tpl',
'Content' => 'Contents/Inscription.tpl',
'ContentOK' => 'Contents/Inscription2.tpl'
));
$template->assign_vars(array(
'CSS_PATH' => $cssPath,
'CSS_COLOR' => $cssDesign,
'USERID' => $sesMembre,
));
$template->pparse('Doctype');
$template->pparse('IdentMenu');
$template->pparse('TopMenu');
$template->pparse('RightMenu');
if (isset($_POST['inscription'])) {
extract($_POST,EXTR_OVERWRITE);
// Vérification si le pseudonyme est déjà utilisé
$champs = 'pseudo';
$reponse = $pseudo;
$AccountValidation = AccountValidation($champs, $reponse);
if ($AccountValidation == 'TRUE') {
header('Location: inscription.php?errid=ERR41');
}
else {
$champs = 'email';
$reponse = $email;
// On vérifie si l'adresse email a déjà été utilisée
$AccountValidation2 = AccountValidation($champs, $reponse);
if ($AccountValidation2 == 'TRUE') {
header('Location: inscription.php?errid=ERR40');
}
}
// Traitement du formulaire
// Les motifs regex
$motif_pseudo = '`^[[:alnum:][]{}^-_|]{2,12}$`';
$motif_password = '`^[[:alnum:]]{6,12}$`';
$motif_email = '/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}.[a-zA-Z]{2,4}$/';
$motif_datenaissance = '`^(((0[1-9])|(1d)|(2d)|(3[0-1]))/((0[1-9])|(1[0-2]))/(d{4}))$`';
// Traitement du champs pseudo
// Validation 2 caractères minimum pour le champs pseudo
if (strlen($pseudo) < 2) {
$erreur_pseudo = 'Votre pseudo doit contenir au minimum 2 caractères.';
}
else {
// Vérification des caractères utilisés dans le champs pseudo
if (!preg_match($motif_pseudo, $pseudo)) {
$erreur_pseudo = 'Seuls les caractères alpha-numériques ainsi que [ ] { } - _ ^ | sont autorisés.';
}
else {
$pseudo_ok = 'TRUE';
}
}
// Traitement du champs password
// Validation 6 caractères minimum pour le champs password
if (strlen($password) < 6) {
$erreur_password = 'Votre mot de passe doit contenir au minimum 6 caractères.';
}
else {
// Vérification des caractères utilisés dans le champs password ALPNUM only
if (!preg_match($motif_password, $password)) {
$erreur_password = 'Seuls les caractères alpha-numériques sont autorisés.';
}
else {
$password_ok = 'TRUE';
}
}
// Traitement du champs de confirmation du password
if (empty($password2)) {
$erreur_password2 = 'Vous devez absolument confirmer votre mot de passe.';
}
else {
if ($password2 != $password) {
$erreur_password2 = 'Le mot de passe saisie ne correspond pas au premier mot de passe.';
}
else {
$password2_ok = 'TRUE';
}
}
// Traitement du champs email
// Vérification du champs à savoir s'il est vide
if (empty($email)) {
$erreur_email = 'Vous devez entrer votre adresse email pour activer votre profil.';
}
else {
// Vérification du format de l'adresse email saisie
if (!preg_match($motif_email, $email)) {
$erreur_email = 'Le format de votre adresse email n'est pas valide.';
}
else {
$email_ok = 'TRUE';
}
}
// Traitement du champs date de naissance
// Vérification du champs à savoir s'il est vide
if (empty($date_naissance)) {
$erreur_datenaissance = 'Vous devez absolument inscrire votre date de naissance. (JJ/MM/AAAA)';
}
else {
// Vérification du format de la date saisie
if (!preg_match($motif_datenaissance, $date_naissance)) {
$erreur_datenaissance = 'Vous devez saisir votre date de naissance en utilisant le format JJ/MM/AAAA';
}
else {
$date_naissance_ok = 'TRUE';
}
}
// Traitement du champs ville
// Vérification du champs à savoir s'il est vide
if ($ville == 'false') {
$erreur_ville = 'Vous devez choisir la région ou province dans laquelle vous habitez.';
}
else {
$ville_ok = 'TRUE';
}
// Traitement du champs code de sécurité
// On vérifie si le champs est vide
if (empty($code)) {
$erreur_code = 'Vous devez saisir le code de sécurité qui apparaît sur l'image ci-dessus.';
}
else {
$ValidCode = ValidCode($code, $sesCode);
if ($ValidCode = 'FALSE') {
$erreur_code = 'Vous avez fait une erreur lors de la saisie du code de sécurité.';
}
else {
$code_ok = 'TRUE';
}
}
// Affectation au template les messages d'erreur, sinon, en cas d'autre erreur
// Affecté aux différents input jugé correct la valeur saisie initiale
if (isset($erreur_pseudo)) {
$template->assign_vars(array(
'ERREUR_PSEUDO' => $erreur_pseudo
));
}
else {
$template->assign_vars(array(
'PSEUDO' => $pseudo
));
}
if (isset($erreur_password)) {
$template->assign_vars(array(
'ERREUR_PASSWORD' => $erreur_password
));
}
if (isset($erreur_password2)) {
$template->assign_vars(array(
'ERREUR_PASSWORD2' => $erreur_password2
));
}
if (isset($erreur_email)) {
$template->assign_vars(array(
'ERREUR_EMAIL' => $erreur_email
));
}
else {
$template->assign_vars(array(
'EMAIL' => $email
));
}
if (isset($erreur_datenaissance)) {
$template->assign_vars(array(
'ERREUR_DNAISSANCE' => $erreur_datenaissance
));
}
if (isset($erreur_ville)) {
$template->assign_vars(array(
'ERREUR_VILLE' => $erreur_ville
));
}
if (isset($erreur_code)) {
$template->assign_vars(array(
'ERREUR_CODE' => $erreur_code
));
}
// Si tout les champs sont validés
// On insère les données pour activation du compte par un administrateur.
if ($pseudo_ok == 'TRUE' && $password_ok == 'TRUE' && $password2_ok == 'TRUE' && $email_ok == 'TRUE' && $date_naissance_ok == 'TRUE' && $ville_ok = 'TRUE') {
if ($code_ok = 'TRUE') {
// On crée une clé d'activation aléatoire pour une activation du profil ultérieurement par le membre
mt_srand((double)microtime()*1000000);
$cle_dactivation = md5( mt_rand(0,9999999) );
$adresseip = $_SERVER['REMOTE_ADDR'];
$password = md5($password);
// Requête permettant d'ajouter les informations dans la table bce_membres
$conNewMembre = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die("Erreur lors de la connection à la base de données: ". mysql_error());
$dbNewMembre = mysql_select_db($cfgBase, $conNewMembre) or die('Erreur lors de la sélection de la base de données: '. mysql_error());
// Corriger l'ajoute de la ville ou non?? texte ou chiffre et multi requête lors de l'affichage??
$reqNewMembre = "INSERT INTO bce_membres VALUES('', '$pseudo', '$adresseip', '$password', '0', '$cle_dactivation', '$email', '$date_naissance', 'N10', '0', '$ville' ,'')";
$resNewMembre = mysql_query($reqNewMembre) or die('Erreur lors de l'enregistrement du formulaire soumis, veuillez contacter un administrateur: '. mysql_error());
if (!$resNewMembre) {
die('Erreur lors de l'enregistrement du formulaire soumis, veuillez contacter un administrateur le plus tôt possible.');
}
else {
// On ferme la connection à MySQL
mysql_close($conNewMembre);
// On détruit les variables de formulaire
unset($pseudo);
unset($adresseip);
unset($password);
unset($password2);
unset($cle_dactivation);
unset($email);
unset($date_naissance);
unset($ville);
// On appelle le template pour afficher que le form a été enregistré
$template->pparse('ContentOK');
}
}
else {
$template->pparse('Content');
}
}
else {
$template->pparse('Content');
}
}
else {
// Si un message d'erreur est présent, le script suivant ira chercher le message correspondant au numéro d'erreur
$errid = $_GET['errid'];
// Définir provenance pour empêcher les gens de saisir n'importe quoi comme ERRID.... À venir
if (isset($errid)) {
$connect = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die('Erreur lors de la connexion à la base de données '. mysql_error());
$select = mysql_select_db($cfgBase, $connect) or die('Erreur lors de la sélection de la base de données '. mysql_error());
$req = "SELECT msgerreur FROM bce_msgerreurs WHERE errid='$errid'";
$res = mysql_query($req) or die('Erreur lors de la sélection des données '. mysql_error());
$countErrid = mysql_num_rows($res);
$data = mysql_fetch_array($res);
if ($countErrid < 1) {
header("Location: index.php");
}
else {
$errid = $data["msgerreur"];
mysql_close($connect);
}
}
if (isset($erreur_pseudo)) {
echo $erreur_pseudo;
}
$template->assign_vars(array(
'MESSAGE_ERREUR' => $errid
));
$template->pparse('Content');
}
$template->pparse('Footer');
ob_end_flush();[/code]
À la ligne 55 et 64 je fais appel à la fonction AccountValidation() pour vérifier si le pseudo ou email est présent dans la base de données.
[code]
<?php
// Fonction vérifiant si un compte existe pour $pseudo ou $email
function AccountValidation($champs, $reponse) {
global $cfgHote, $cfgUser, $cfgPass, $cfgBase;
// Connection à la base de données
$connectAV = mysql_connect($cfgHote, $cfgUser, $cfgPass) or die('Échec lors de la connexion à la base de données: '. mysql_error());
// Sélection de la base de données MySQL
$selectAV = mysql_select_db($cfgBase, $connectAV) or die('Échec lors de la sélection de la base de données: '. mysql_error());
// Requête vérifiant s'il y a une occurence lors de l'identification
$reqAV = "SELECT count(pseudo) as countAV FROM bce_membres WHERE $champs='$reponse'";
$resAV = mysql_query($reqAV) or die('Échec lors de la sélection des données: '. mysql_error());
$rowCountAV = mysql_fetch_array($resAV);
if ($rowCountAV['countAV'] == 1) {
$rowCountAVErreur = 'TRUE';
}
else {
$rowCountAVErreur = 'FALSE';
}
return $rowCountAVErreur;
}
?>
[/code]
Merci à l'avance,
Forensic
Édité par Forensic Le 27/02/2007 à 18h27
Chercher sur le forum - /Consulter la Documentation - Consulter la Foire aux Questions (FAQ)
Dire bonjour et merci, c'est toujours apprécié et pensez à mettre vos messages en Réglé!
ben.popeye Membre non connecté
-
Modérateur
- Voir le profil du membre ben.popeye
- Inscrit le : 04/08/2005
- Site internet
- Groupes :
-
Equipe Historique
- Au lieu d'utiliser 'true' et 'false' qui correspondent à des chaînes il serait largement plus judicieux d'utiliser true et false de type booléen, php gère les booléens profitons-en! Ca sera à la fois plus clair mais on peut avec ça éviiter de se casser la tête, par exemple if( $var ) correspondra à if( $var === true ) si elle est déclarée en booléen.
- Je serais toi je me connecterais à la base de données au début avec une déconnexion à la fin. C'est une perte de temps de vouloir s'y reconnecter à chaque requête, ça oblige d'avoir des variables globales accessibles partout et ça évite des bugs supplémentaires, sur PHPBoost ça marche comme ça.
Quant à ton problème que te renvoie ta fonction lorsque tu vérifies que le pseudo n'existe pas déjà? As-tu fait un echo de cette variable?
Un problème, une question ? Cherchez dans la FAQ ou la documentation. Si vous ne trouvez pas la réponse, demandez du support sur le forum.
Bjarne Stroustrup, inventeur du C++ :"There are two ways to write error-free programs; only the third works."
Forensic Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre Forensic
- Inscrit le : 18/12/2006
Pour la question je te répondrais que ce n'est pas fou. Je n'y avais pas pensé!
Forensic
Chercher sur le forum - /Consulter la Documentation - Consulter la Foire aux Questions (FAQ)
Dire bonjour et merci, c'est toujours apprécié et pensez à mettre vos messages en Réglé!
Forensic Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre Forensic
- Inscrit le : 18/12/2006
Ça faisait plusieurs jours que je n'avais pas travaillé sur mon site. Vive le travail!
Le code suivant semble fonctionnel (mais en même temps ne semble pas l'être après exécution)
[code]
<?php
$motif_password = '`^[[:alnum:]]{6,12}$`';
// Traitement du champs password
// Validation 6 caractères minimum pour le champs password
if (strlen($password) < 6) {
$erreur_password = 'Votre mot de passe doit contenir au minimum 6 caractères.';
}
else {
// Vérification des caractères utilisés dans le champs password ALPNUM only
if (!preg_match($motif_password, $password)) {
$erreur_password = 'Seuls les caractères alpha-numériques sont autorisés.';
}
}
// Traitement du champs de confirmation du password
if (empty($password2)) {
$erreur_password2 = 'Vous devez absolument confirmer votre mot de passe.';
}
else {
if ($password2 != $password) {
$erreur_password2 = 'Le mot de passe saisie ne correspond pas au premier mot de passe.';
}
}
?>[/code]
Si les variables $erreur_password et $erreur_password2 sont affectées, je les affecte au templates
[code]<?php
if (isset($erreur_password)) {
$template->assign_vars(array(
'ERREUR_PASSWORD' => $erreur_password
));
}
if (isset($erreur_password2)) {
$template->assign_vars(array(
'ERREUR_PASSWORD2' => $erreur_password2
));
}
?>[/code]
Le vrai problème semble être ici:
[code]
<?php
if ($pseudo && $password && $password2 && $email && $date_naissance && $sexe && $ville && $code) {
// Script qui inscrit les données soumises dans mysql
}
else {
$template->pparse('Content');
}
?>[/code]
Le problème est que même si $password2 != $password les données sont envoyées à MYSQL
Forensic
Chercher sur le forum - /Consulter la Documentation - Consulter la Foire aux Questions (FAQ)
Dire bonjour et merci, c'est toujours apprécié et pensez à mettre vos messages en Réglé!
CrowkaiT Membre non connecté
-
Modérateur
- Voir le profil du membre CrowkaiT
- Inscrit le : 17/06/2005
- Site internet
- Groupes :
-
Equipe Historique
Tu ne fais aucune vérification là, si $password2 != $password ya aucune raison qu'il ne rentre pas dans cette condition.
Pas de support par messages privés! Pensez à mettre vos messages en réglé en cliquant sur le bouton réglé!
ben.popeye Membre non connecté
-
Modérateur
- Voir le profil du membre ben.popeye
- Inscrit le : 04/08/2005
- Site internet
- Groupes :
-
Equipe Historique
Un problème, une question ? Cherchez dans la FAQ ou la documentation. Si vous ne trouvez pas la réponse, demandez du support sur le forum.
Bjarne Stroustrup, inventeur du C++ :"There are two ways to write error-free programs; only the third works."
minirop Membre non connecté
Booster Bazooka
-
Booster Bazooka
- Voir le profil du membre minirop
- Inscrit le : 15/01/2006
- Site internet
formulaire.php -> verif.php (vérification et inscription dans la BdD si besoin) -> ok.php (ou pasok.php) comme çà s'il fait "F5" il rafraichira ok.php et pas verif.php
Forensic Membre non connecté
Booster Mortier
-
Booster Mortier
- Voir le profil du membre Forensic
- Inscrit le : 18/12/2006
Le formulaire et le traitement ainsi que l'affichage du message que tout est entré en BDD est sur le même fichier php.
J'ai réglé le problème, merci pour votre aide à tous encore!
Forensic
Chercher sur le forum - /Consulter la Documentation - Consulter la Foire aux Questions (FAQ)
Dire bonjour et merci, c'est toujours apprécié et pensez à mettre vos messages en Réglé!
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie