Ah oui c'est vraiment un vieux tuto (ou un mauvais tuto :D ) (D'ailleurs si jamais tu es sur le discord de Grafikart tu peux me l'envoyer en mp ?)
Je vais essayé dans dire le plus ici, je vais essayé d'être assez clair :)
Commençons par la connexion à la bdd. Si cette connexion est vraiment dans le même fichier je te conseil de sortir le code dans un autre fichier.
<?php
// fichier connection.php
// N'oublie pas de remplacer les valeurs par les tiennes
const DB_HOST = 'localhost';
const DB_NAME = 'test';
const DB_USER = 'root';
const DB_PASS = 'root';
// Essaye de choisir entre mettre des noms en français ou en anglais, mais pas les deux en même temps
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
$db = new PDO($dsn, DB_USER, DB_PASS);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
Le fait de séparer dans un autre fichier permet d'avoir la possibilité de l'inclure à plusieurs endroits mais de au besoin le modifier qu'a un seul endroit. C'est un peu comme créer une fonction. Cela permet la réutilisabilité.
Voici maintenant la page d'inscription :
<?php
// Je conseille de séparer le traitement de la vue (le HTML) dans des fichiers différents (ou url différentes)
// C'est plus propre et plus facile à maintenir
// Mais pour l'exemple, je vais tout mettre dans le même fichier.
// Je te laisserai le soin de séparer le traitement de la vue
// Je m'assure que je pars bien du bon dossier
require __DIR__ . '/connection.php';
// Sauf si tu as plusieurs formulaires sur la même page qui pointe ici,
// tu n'as pas besoin de conditionner sur le bouton
if (!empty($_POST)) {
// Traitement du formulaire
// Jamais de "htmlspecialchars" dans le traitement, c'est la vue qui s'en charge
// Explication ici : https://zestedesavoir.com/articles/2489/ne-pas-confondre-faille-par-injection-sql-et-faille-xss/
$login = $_POST['login'] ?? null;
$email = $_POST['email'] ?? null;
$password = $_POST['password'] ?? null;
// On va retenir les erreurs dans un tableau
// Cela va permettre d'éviter les "if" imbriqués
$errors = [];
if (empty($login) || empty($email) || empty($password)) {
$errors[] = 'Tous les champs doivent être complétés !';
}
// tu peux utiliser strlen si l'extension mbstring n'est pas activée
if (mb_strlen($login) > 255) {
$errors[] = 'Votre pseudo ne doit pas dépasser 255 caractères !';
}
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
$errors[] = "Votre adresse mail n'est pas valide !";
}
if (mb_strlen($password) < 12) {
$errors[] = 'Votre mot de passe doit faire au moins 12 caractères !';
}
// Comme tu peux le voir ici, je n'utilise pas de double champs pour le mot de passe et pour l'email
// C'est prouvé que cela ne sert pas, car souvent les personnes copient/collent les valeurs
$reqUser = $db->prepare('SELECT id FROM users WHERE email = :email');
$reqUser->execute(['email' => $email]);
$user = $reqUser->fetch();
if ($user) {
$errors[] = 'Adresse mail déjà utilisée !';
}
if (empty($errors)) {
// Si la valeur par défaut est connue (ici le "3" et le "default.png"), alors tu peux directement l'insérer dans la requête
$insertUser = $db->prepare('INSERT INTO users (login, email, password, role_id, avatar) VALUES (:login, :email, :password, "3", "default.png")');
$insertUser->execute([
'login' => $login,
'email' => $email,
'password' => password_hash($password, PASSWORD_DEFAULT),
]);
// Comme tu peux le voir c'est plus clair d'utiliser des paramètres nommés (avec les ":")
// que d'utiliser des paramètres positionnels (avec "?")
// Cela permet de ne pas se tromper dans l'ordre des paramètres
// Et de pouvoir réutiliser le même paramètre plusieurs fois dans la requête
// Si tu veux rediriger vers une autre page, tu peux utiliser la fonction "header"
// j'y ajoute les paramètres replace et response_code pour être sûr que la requête renvoie bien un code 302
header('Location: login.php', true, 302);
// On arrête le script, car sinon le script continue et affiche le formulaire
// Pour ici ce n'est pas très grave, mais si tu as du code après le header, il sera exécuté
// et par exemple un admin panel pourrait afficher des informations sensibles à un utilisateur non connecté
exit();
}
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<title>TITLE</title>
<!-- je ne mets pas tout le code HTML -->
</head>
<body>
<?php if (!empty($errors)): ?>
<p>Erreurs lors de la soumission du formulaire</p>
<ul>
<?php foreach ($errors as $error): ?>
<li><?= htmlspecialchars($error) ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form method="post">
<div>
<label for="login">Pseudo</label>
<input type="text" name="login" id="login" value="<?= htmlspecialchars($login ?? '') ?>">
<!-- Vraiment pratique cet opérateur "??" apparût avec php 7.0 il y a 6, 7 ans environ :D -->
</div>
<div>
<label for="email">Email</label>
<input type="email" name="email" id="email" value="<?= htmlspecialchars($email ?? '') ?>">
</div>
<div>
<label for="password">Mot de passe</label>
<input type="password" name="password" id="password">
</div>
<button type="submit">S'inscrire</button>
</form>
</body>
</html>
J'ai mis des commentaires dans le code mais si tu as des questions je peux y répondre.
Je n'ai fais que l'inscription, je te laisse voir pour la connexion.