Page 1 sur 1

Formulaire d'enregistrement

Posté : 10 mai 2019, 12:53
par Unyck
Bonjour, je suis entrain de mettre en place un formulaire d'enregistrement en PHP / SQL

Plusieurs choses : Le formulaire simple fonctionne correctement, je rajoute petit a petit des détails

<?php

$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '******';
$DATABASE_NAME = 'Base';
// essaie de ce connecter
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if (mysqli_connect_errno()) {
	// affiche le message d'erreur si problème de connection
	die ('Impossible de ce connecter à MYSQL: ' . mysqli_connect_error());
}

// Verification des données
if (!isset($_POST['username'], $_POST['password'], $_POST['email'])) {
	// ne récupère pas les informations envoyées
	die ('Veuillez remplir le formulaire d\'enregistrement!');
}
// tout doit être rempli
if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['confirmpassword']) || empty($_POST['email'])) {
	// une ou plusieurs valeur sont vide
	die ('Veuillez remplir le formulaire d\'enregistrement!');
}

// vérification du nom utilisateur mail mot de passe 
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
	die ('l\'email n\'est pas valide !');
}
if (preg_match('/[A-Za-z]+/', $_POST['username']) == 0) {
    die ('Seul les charactères alphanumériques minuscules et majuscules sont autorisés');
}
if (strlen($_POST['username']) > 20 || strlen($_POST['username']) < 5) {
	die ('Le nom d\'utilisateur doit comporter 5 à 20 charactères!');
}
if (strlen($_POST['password']) > 20 || strlen($_POST['password']) < 5) {
	die ('Le mot de passe doit comporter 5 à 20 charactères!!');
}
// a intégrer ici mot de passe identique et vérification mail unique

if ($stmt = $con->prepare('SELECT id, password FROM users WHERE username = ?')) {
	// Bind parameters (s = string, i = int, b = blob, etc), hash the password using the PHP password_hash function.
	$stmt->bind_param('s', $_POST['username']);
	$stmt->execute();
	$stmt->store_result();
	// vérifie si le compte existe dans la base
	if ($stmt->num_rows > 0) {
		// le nom utilisateur existe déjà
		echo 'Le nom d\'utilisateur existe déjà!';
	} else {
		// utilisateur existe pas insertion
if ($stmt = $con->prepare('INSERT INTO users (username, password, email) VALUES (?, ?, ?)')) {
	// encryption du mot de passe
	$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
	$stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
	$stmt->execute();
	echo 'Vous êtes désormais inscrit, veuillez télécharger l\'installateur de jeu ci-dessous pour vous connectez';
} else {
	// problème état dans la base de données vérifier si elle comporte les champs requis
	echo 'Déclaration invalide!';
}
	}
	$stmt->close();
} else {
	// problème état dans la base de données vérifier si elle comporte les champs requis
	echo 'Déclaration invalide!';
}
$con->close();
?>


certains me pose problèmes

1 - Je veux vérifier si le mot de passe taper est le bon, j'utilise ça, est ce que je suis proche de la méthode la plus simple ?

if (strlen($_POST['password']) == ($_POST['confirmpassword'])) {
	die ('Les mots de passe ne sont pas identiques');
2 - Je veux vérifier si l'email n'existe pas déjà dans la base de donnée, est ce la bonne méthode ?

$verifemail = mysql_query("SELECT email FROM users WHERE email='$email'") or die(mysql_error());
if	(
mysql_num_rows($verifemail) != 0
)
{
    echo 'Cette adresse email existe déjà !';
}
3 - Dernierement, est ce qu'il est possible de ce baser la-dessus http://www.phpdebutant.org/article153.php
pour rappeler le formulaire et que l'utilisateur vois les messages d'erreurs dans celui si sans qu'il ai à revenir sur la page précédente et devoir tout retaper manuellement ?


Merci pour votre aide, l'apprentissage avance !

Re: Formulaire d'enregistrement

Posté : 10 mai 2019, 13:45
par @rthur
Bonjour,

Pour le 1) tu as une erreur de logique dans ton code.
Quelles sont les fonctions que tu utilises dans ces 2 lignes de codes et pourquoi les utilises-tu ?

Pour le 2) tu ne dois plus utiliser les fonctions mysql_* mais soit mysqli soit PDO

Pour le 3) ma recommandation est de ne plus utiliser les tutos du site phpdebutant qui est un site à l'abandon depuis plusieurs années (les "actualités" sur la page d'accueil ont + de 10 ans ! ) et dont la majorité des tutos sont obsolètes.

Re: Formulaire d'enregistrement

Posté : 10 mai 2019, 15:59
par Unyck
Merci Arthur d'avoir pris le temps de me répondre, je vais travailler sur le deuxième point ce weekend.

J'ai cherché mes erreurs sur le premier point ; j'arrive a cette conclusion :
if ($_POST["password"] === $_POST["confirmpassword"]) {
}
else {
   die ('Les mots de passe ne sont pas identiques');
}
une idée de ou je pourrais trouver des informations sur la troisième partie qui serait à jours ?

Re: Formulaire d'enregistrement

Posté : 10 mai 2019, 16:48
par @rthur
J'ai relu le tuto que tu as donné et il ne semble pas trop obsolète donc oui tu peux te baser dessus, au moins sur le principe, ce qu'ils font est correct.

A noter que pour valider les données, il existe des fonctions dédiées dans PHP qui permettent de faire ça plus simplement qu'avec un preg_match().
Voici un tuto assez complet avec des exemples :
https://openclassrooms.com/fr/courses/1 ... tilisateur

Re: Formulaire d'enregistrement

Posté : 12 mai 2019, 16:22
par Unyck
Alors, j'ai pu avancer sur mon formulaire, j'ai réussi a afficher les messages d'erreurs de saisie de cette façon :
<?php
class Session{
	
	public function __construct(){
		session_start();
	}
	
	public function setFlash($message,$type = 'error'){
		$_SESSION['flash'] = array(
		'message' => $message,
		'type'	  => $type
		);
	}
	
	public function flash(){
		if(isset($_SESSION['flash'])){
			?>
			<div id="alert" class="alert alert-<?php echo $_SESSION['flash']['type'];
			?>">
				<a class="close">x</a>
				<?php echo $_SESSION['flash']['message']; ?>
			</div>
			<?php
			unset($_SESSION['flash']);
		}
	}
	
}

ma page principal :
<?php
require("session.class.php");
$Session = new Session();
?>

<!DOCTYPE html>
<html>
<head>
 
  <meta charset="UTF-8">
 <title>Aria s'enregister</title>
 <link href="//db.onlinewebfonts.com/c/a4e256ed67403c6ad5d43937ed48a77b?family=Core+Sans+N+W01+35+Light" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="register.css" type="text/css">
</head>

<body>
<div class="body-content">
  <div class="module">

    <h1>Créer un compte</h1>
	<?php $Session->flash(); ?>
    <form class="form" action="register.php" method="post" enctype="multipart/form-data" autocomplete="off">
 
      <input type="text" placeholder="Nom d'utilisateur" name="username" required />
      <input type="email" placeholder="Email" name="email" required />
      <input type="password" placeholder="Mot de passe" name="password" autocomplete="new-password" required />
      <input type="password" placeholder="Confirmer le mot de passe" name="confirmpassword" autocomplete="new-password" required />
      </br></br></br>
      <input type="submit" value="S'enregistrer" name="register" class="btn btn-block btn-primary" />
    </form>
	 
  </div>
</div>


<script src="js/jquery.js"></script>
<script type="text/javascript" src="js/main.js"></script>	


</body>
</html>
ma page de traitement :
<?php
require("session.class.php");
header('Location:toregister.php');

// Change this to your connection info.
$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '********';
$DATABASE_NAME = 'Aria_Game';
// essaie de ce connecter
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if (mysqli_connect_errno()) {
	 // affiche le message d'erreur si problème de connection
	
	$Session = new Session();
	$Session->setFlash('Problème de connection Mysql','warning');

}

// Verification des données
if (!isset($_POST['username'], $_POST['password'], $_POST['email'])) {
	
	$Session = new Session();
	$Session->setFlash('Veuillez remplir le formulaire d\'enregistrement!','error');

}
// tout doit être rempli
if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['confirmpassword']) || empty($_POST['email'])) {
	
	$Session = new Session();
	$Session->setFlash('Veuillez remplir le formulaire d\'enregistrement!','error');

}

// vérification du nom utilisateur mail mot de passe 
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {

	$Session = new Session();
	$Session->setFlash('l\'email n\'est pas valide !','error');
	
}
if (preg_match('/[A-Za-z]+/', $_POST['username']) == 0) {
	
	$Session = new Session();
	$Session->setFlash('Seul les charactères alphanumériques minuscules et majuscules sont autorisés','error');

}
if (strlen($_POST['username']) > 20 || strlen($_POST['username']) < 5) {
	
	$Session = new Session();
	$Session->setFlash('Le nom d\'utilisateur doit comporter 5 à 20 charactères','error');

}
if (strlen($_POST['password']) > 20 || strlen($_POST['password']) < 5) {

	$Session = new Session();
	$Session->setFlash('Le mot de passe doit comporter 5 à 20 charactères!','error');
	
}
if ($_POST["password"] === $_POST["confirmpassword"]) {
}
else {
   	$Session = new Session();
	$Session->setFlash('Les mots de passe ne sont pas identiques','error');
}

if ($stmt = $con->prepare('SELECT id, password, FROM users WHERE username = ?')) {

	$stmt->bind_param('s', $_POST['username']);
	$stmt->execute();
	$stmt->store_result();
	// vérifie si le compte existe dans la base
	if ($stmt->num_rows > 0) {
		// le nom utilisateur existe déjà
		echo 'Le nom d\'utilisateur existe déjà!';
		

	} else {
		// creation nouveau compte
if ($stmt = $con->prepare('INSERT INTO users (username, password, email) VALUES (?, ?, ?)')) {
	// encryption du mot de passed
	$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
	$stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
	$stmt->execute();

	echo 'Vous êtes désormais inscrit, veuillez télécharger l\'installateur de jeu ci-dessous pour continuer';
} else {
	// problème état dans la base de données vérifier si elle comporte les champs requis
	echo 'Déclaration invalide!';
}
	}
	$stmt->close();
} else {
	// problème état dans la base de données vérifier si elle comporte les champs requis
	echo 'Déclaration invalide!';
}
$stmt->close();

?>


depuis que j'ai rajouté les $Session je n'arrive plus a écrire dans la base mais les erreurs de saisie fonctionne, j'aimerai de l'aide pour corriger cette partie :

if ($stmt = $con->prepare('SELECT id, password, FROM users WHERE username = ?')) {

	$stmt->bind_param('s', $_POST['username']);
	$stmt->execute();
	$stmt->store_result();
	// vérifie si le compte existe dans la base
	if ($stmt->num_rows > 0) {
		// le nom utilisateur existe déjà
		echo 'Le nom d\'utilisateur existe déjà!';
		

	} else {
		// creation nouveau compte
if ($stmt = $con->prepare('INSERT INTO users (username, password, email) VALUES (?, ?, ?)')) {
	// encryption du mot de passed
	$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
	$stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
	$stmt->execute();

	echo 'Vous êtes désormais inscrit, veuillez télécharger l\'installateur de jeu ci-dessous pour continuer';
} else {
	// problème état dans la base de données vérifier si elle comporte les champs requis
	echo 'Déclaration invalide!';
}
	}
	$stmt->close();
} else {
	// problème état dans la base de données vérifier si elle comporte les champs requis
	echo 'Déclaration invalide!';
}
$stmt->close();

?>

mes objectifs non atteint: revalider le fonctionnement du formulaire, ajouter la vérification d'email existant dans la BDD, redirection sur un autre page quand le formulaire est validé.