Problème conditions

Résolu/Fermé
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - 29 sept. 2016 à 22:08
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - 3 oct. 2016 à 19:48
Bonsoir, voilà je débute tout juste est j'ai un problème de conditions.

En temps normal je devrais pas pouvoir m'inscrire si j'ai le même pseudo ou la même adresse mais pourtant j'arrive a le faire je me demande pourquoi.

Si vous pouvez m'aider.


<?php
$bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membre', 'root', '');

if(isset($_POST['forminscription']))
{
	if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mail2']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2']))
	{
		$pseudo = htmlspecialchars($_POST['pseudo']);
		$mail = htmlspecialchars($_POST['mail']);
		$mail2 = htmlspecialchars($_POST['mail2']);
		$mdp = sha1($_POST['mdp']);
		$mdp2 = sha1($_POST['mdp2']);  
		
		$pseudolength = strlen($pseudo);
		if($pseudolength <= 25)
		{
			$reqpseudo = $bdd->prepare("SELECT * FORM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			$pseudoexist = $reqpseudo->rowCount();
			if($pseudoexist == 0)
			{
				if($mail == $mail2)
				{
					if(filter_var($mail, FILTER_VALIDATE_EMAIL))
					{
						$reqmail = $bdd->prepare("SELECT * FORM membres WHERE mail = ?");
						$reqmail->execute(array($mail));
						$mailexist = $reqmail->rowCount();
						if($mailexist == 0)
						{
							if($mdp == $mdp2)
							{
								$insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)");
								$insertmbr->execute(array($pseudo, $mail, $mdp));
								$erreur = "Votre compte a bien été créé !";
							}
							else
							{
							$erreur = "Vos mots de passe ne correspondent pas !";
							}
						}
						else
						{
							$erreur = "Adresse mail déjà uttilisée !";
						}
					}
					else
					{
						$erreur = "Votre adresse mail n'est pas valide !";
					}
				}
				else
				{
					$erreur = "Vos adresses mail ne correspondent pas !";
				}
			}
			else
			{
				$erreur = "Votre pseudo est déjà uttilisée !";
			}
		}
		else
		{
			$erreur = "Votre pseudo ne doit pas dépasser 25 caractères  !";
		}
	}
	else
	{
		$erreur = "Tous les champs doivent être complétés !";
	}
	
}

?>



<html>
	<head>
		<title>Mon site</title>
		<meta charset="utf-8">
	</head>
	<body>
		<div align="center">
			<h2>Inscription</h2>
			<br/><br/><br/>
			<form method="POST" action="">
			
				<table>
					<tr>
						<td align="right">
							<label for="pseudo">Pseudo :</label>
						</td>
						<td>
							<input type="text" placeholder="Votre pseudo" id="pseudo" name="pseudo" value="<?php if(isset($pseudo)) { echo $pseudo; } ?>" />
						</td>
					</tr>
					<tr>
						<td align="right">
							<label for="mail">Mail :</label>
						</td>
						<td>
							<input type="email" placeholder="Votre e-mail" id="mail" name="mail" value="<?php if(isset($mail)) { echo $mail; } ?>"/>
						</td>
					</tr>
					<tr>
						<td align="right">
							<label for="mail2">Confirmation du mail :</label>
						</td>
						<td>
							<input type="email" placeholder="Confirmez votre mail" id="mail2" name="mail2" value="<?php if(isset($mail2)) { echo $mail2; } ?>"/>
						</td>
					</tr>
					<tr>
						<td align="right">
							<label for="mdp">Mot de passe :</label>
						</td>
						<td>
							<input type="password" placeholder="Votre mot de passe" id="mdp" name="mdp" />
						</td>
					</tr>
					<tr>
						<td align="right">
							<label for="mdp2">Confirmation du mot de passe :</label>
						</td>
						<td>
							<input type="password" placeholder="Confirmez votre MDP" id="mdp2" name="mdp2" />
						</td>
					</tr>
					<tr>
						<td></td>
						<td>
						<br/>
							<input type="submit" name="forminscription" value="Je m'inscris" />
						</td>
					</tr>
				</table>
				
				
			</form>
			<?php
			if(isset($erreur))
			{
				echo '<font color= "red">'.$erreur."</font>";
			}
			?>
		</div>
	</body>
</html>

3 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
30 sept. 2016 à 12:25
Salut,

La méthode rowCount() de PDO ne garantie par de retourner le nombre de ligne pour une requête de type SELECT (cf. doc) : https://www.php.net/manual/fr/pdostatement.rowcount.php

Tu peux trouver sur cette même doc un exemple de récupération du nombre de ligne via une requête SELECT COUNT(*) et d'un fetchColumn() à la place de rowCount() : https://www.php.net/manual/fr/pdostatement.rowcount.php#example-1065

Bonne journée,
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
Modifié par flo39400 le 30/09/2016 à 19:57
Bonsoir, merci de m'avoir répondu, mais après modification j'ai aucun message d'erreur qui s'affiche et j'arrive a enregistré le même utilisateur plusieurs fois.

je vous montre cela, pour la condition doit être vrai pour le serveur car sinon il devrait avoir une erreur.


if($pseudolength <= 25)
		{
			$reqpseudo = $bdd->prepare("SELECT COUNT(*) FORM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			$pseudoexist = $reqpseudo->fetchColumn();
			if($pseudoexist == 0)
			{
				if($mail == $mail2)
				{
					if(filter_var($mail, FILTER_VALIDATE_EMAIL))
					{
						$reqmail = $bdd->prepare("SELECT COUNT(*) FORM membres WHERE mail = ?");
						$reqmail->execute(array($mail));
						$mailexist = $reqmail->fetchColumn();
						if($mailexist == 0)
						{
							if($mdp == $mdp2)
							{
								$insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)");
								$insertmbr->execute(array($pseudo, $mail, $mdp));
								$erreur = "Votre compte a bien été créé !";
							}
							else
							{
							$erreur = "Vos mots de passe ne correspondent pas !";
							}
						}
						else
						{
							$erreur = "Adresse mail déjà uttilisée !";
						}
					}
					else
					{
						$erreur = "Votre adresse mail n'est pas valide !";
					}
				}
				else
				{
					$erreur = "Vos adresses mail ne correspondent pas !";
				}
			}
			else
			{
				$erreur = "Votre pseudo est déjà uttilisée !";
			}
		}
		else
		{
			$erreur = "Votre pseudo ne doit pas dépasser 25 caractères  !";
		}
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
1 oct. 2016 à 23:23
Bonsoir, donc après quelques recherche je suis arrivé a cela:

$reqpseudo = $bdd->prepare("SELECT COUNT(*) AS tot FORM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			//$pseudoexist = $reqpseudo->fetchColumn();
			if($reqpseudo == 0)


Donc au début je voulais récupérer la variable ['tot'] via $reqpseudo['tot'].

Mais j'ai eu une erreur Fatal.

Avec ce code j'ai bien mon message d'erreur en bas comme quoi: "Votre pseudo est déjà utilisé !" mais un message d'erreur aussi tel que: "Notice: Object of class PDOStatement could not be converted".

J'aimerai comprendre afin d'évité ce problème a l'avenir.

Merci d'avance.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
3 oct. 2016 à 09:53
Tu ne peux normalement pas comparer l'objet $reqpseudo avec la valeur 0 puisque cette objet un est PDOStatement et pas directement le résultat de ta requête, d'où le message d'erreur Notice je pense.

L'utilisation de fetchColumn() sur l'objet $reqpseudo est normalement la bonne méthode.
Peux tu stp nous montrer le message d'erreur complet de l'erreur Fatal avec si possible le code correspondant ?
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
3 oct. 2016 à 19:33
$reqpseudo = $bdd->prepare("SELECT COUNT(*) AS tot FORM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			$pseudoexist = $reqpseudo->fetchColumn();
			if($pseudoexist == 0)


Donc la aucun message d'erreur mais le code ne sert a rien car le compte est crée sans vérifié si le pseudo est présent dans la base de donnée.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
3 oct. 2016 à 19:37
$reqpseudo = $bdd->prepare("SELECT COUNT(*) AS tot FORM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			$pseudoexist[tot] = $reqpseudo->fetchColumn();
			if($pseudoexist == 0)



Donc la j'ai bien le message d'erreur: "Votre pseudo est déjà utilisée !"

Et j'ai un le message de la part du serveur: "Notice: Use of undefined constant tot - assumed 'tot' in C:\wamp64\www\site\inscription.php on line 19"
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
3 oct. 2016 à 19:40
$reqpseudo = $bdd->prepare("SELECT COUNT(*) AS tot FORM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			if($pseudoexist == 0)


La donc la condition n'est pas bonne en plus de cela le serveur m'affiche un serveur.

Donc condition fausses.

Message: "Notice: Undefined variable: pseudoexist in C:\wamp64\www\site\inscription.php on line 20"
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
3 oct. 2016 à 19:41
Donc la version 2 est pas mal mais il manque quelque chose.... Vu que j'ai un message.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
3 oct. 2016 à 19:48
Bonsoir, donc j'ai trouvé la solution je vous la partage.

$reqpseudo = $bdd->prepare("SELECT * FROM membres WHERE pseudo = ?");
			$reqpseudo->execute(array($pseudo));
			$pseudoexist = $reqpseudo->rowCount();
			
			if ($pseudoexist == 0)



La tout fonctionne correctement.
0