Sommaire
Formulaire de mise à jour (vue)
Votre attention s'il vous plait, voici un magnifique copié collé.
Et bien oui, notre formulaire de mise à jour d'un point de vue html, n'est guère différent
de celui d'inscription.
La seule différence notable est l'ajout d'une condition qui
vérifiera qu'on a bien un utilisateur selectionné.
<?php
// Si un utilisateur est présent on affiche le formulaire.
if($user){
?>
<form action="" method="post">
<label for="username">Nom d'utilisateur :</label>
<input type="text" name="username" id="username" value="<?php echo $username ?>" required>
<span class="erreur"><?php echo $error["username"]??"" ?></span><br>
<label for="email">Adresse Mail :</label>
<input type="email" name="email" id="email" value="<?php echo $email ?>" required>
<span class="erreur"><?php echo $error["email"]??"" ?></span><br>
<label for="password">Mot de Passe :</label>
<input type="password" name="password" id="password" required>
<span class="erreur"><?php echo $error["password"]??"" ?></span><br>
<label for="passwordBis">Confirmation de Mot de Passe :</label>
<input type="password" name="passwordBis" id="passwordBis" required>
<span class="erreur"><?php echo $error["passwordBis"]??"" ?></span><br>
<!-- Input caché qui contient l'id de l'utilisateur -->
<input type="hidden" name="id" value="<?php echo $user['id']??'' ?>">
<input type="submit" value="Modifier">
</form>
<?php
}else{
//Sinon on affiche un message d'erreur.
?>
<p>
Aucun utilisateurs n'a été trouvé, vous pouvez
trouver la liste des utilisateurs
<a href="listeUserController.php">
ICI
</a>
</p>
<?php
}
?>
Mais que vois t-on ? Un input de type hidden est apparu juste avant notre bouton d'envoi.
Cette page est faite pour être accédé via notre champ de sélection fait dans le chapitre
"READ" pour savoir quel utilisateur on modifiera.
Traitement du formulaire (contrôleur)
Pour pouvoir modifier notre utilisateur, on a déjà besoin de savoir qui il est.
C'est pour cela qu'on est sensé arrivé sur cette page via notre page de lecture (READ),
où nous avons un sélectionneur d'utilisateur.
<?php
// On inclu notre modèle qui s'occupe du lien avec la BDD
include("../models/user-model.php");
// On sélectionne notre utilisateur par son id
// "user" nous vient de notre page READ alors que
// "id" nous vient de notre page UPDATE
$user = selectById((int)$_GET["user"]??(int)$_POST["id"]??"");
//Si on a trouvé un utilisateur.
if($user){
// On déclare nos variables.
$username = $user["username"];
$email = $user["email"];
$password = '';
$error = array();
$regex = "/^(?=.*[!@#$%^&*+-])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z]).{8,20}$/";
// suite du code ici...
}
La fonction selectByID() est défini dans notre modèle, voir plus bas.
La suite va avoir pas mal de point commun avec notre Create et utilisera la fonction clean() que nous avons défini dans le chapitre Create et ne montrerai pas à nouveau ici bien qu'elle doit aussi y être défini.
// Si on arrive ici en méthode POST.
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Si notre "id" est défini.
if(isset($_POST["id"]) && !empty($_POST["id"])){
# tout le code suivant du contrôleur se trouvera ici #
}
}
function clean($field){
// trim retire les caractères d'espacement avant et après la chaîne de caractère
// stripslashes retire les anti slashes \
/* htmlspecialchars transforme les caractères spéciaux html en une version non interprété :
par exemple "<" devient "\<" */
return htmlspecialchars(stripslashes(trim($field)));
}
// On inclu notre vue
include("../views/user-update.php");
?>
On va commencer par vérifier si on doit garder les anciens username et email ou si on prend les nouveaux donnés par l'utilisateur.
// on transforme notre id en int pour être sûr
// que l'utilisateur n'a rien mit d'autre qu'un nombre.
$id = (int)$_POST["id"];
// pour chacun des champs, je vérifie si il a été
// laissé vide, si c'est le cas, je reprend la valeur
// du champ utilisateur. Sauf le mot de passe.
$username = empty($_POST["username"])? $user["username"]:$_POST["username"];
$email = empty($_POST["email"])?$user["email"]:$_POST["email"];
$username = clean($username);
$email = clean($email);
Pour l'username et l'email, les vérification sont bien moindre, on pourrait même retirer ses vérifications dans le cas où ils n'ont pas été modifié.
// J'utilise une regex pour vérifier la validité
// de l'username selon mes choix.
if(!preg_match("/^[a-zA-Z' \-]*$/",$username)){
$error["username"] = "Votre username doit contenir uniquement des lettres.";
}
/* Utilise la fonction filter_var pour vérifier si l'adresse mail est valide
grâce au paramètre FILTER_VALIDATE_EMAIL. Cela peut aussi être fait avec une REGEX */
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$error["email"] = "Veuillez saisir un email valide.";
}
La grande différence pour le mot de passe, c'est que l'on aura besoin de faire aucune vérification si celui ci est vide.
// si le mot de passe est vide on récupère le précédent.
if(empty($_POST["password"])){
$password = $user["password"];
}else{
// On vérifie si les mots de passe sont bien identique.
if($_POST["password"] !== $_POST["passwordBis"]){
$error["passwordBis"] = "Mots de passe différents";
}else{
$password = clean($_POST["password"]);
// On utilise la regex dans la variable $regex déclaré plus haut.
if(!preg_match($regex, $password)){
$error["password"] = "Veuillez saisir un mot de passe valide.";
}else{
// On crée hachage du mot de passe.
$password = password_hash($password, PASSWORD_DEFAULT);
}
}
}
Ici aussi on se retrouve à un code quasiment identique à celui du CREATE.
// Si il n'y a aucune erreur, on fait appel à
// la fonction modifier (voir plus bas).
if(empty($error)){
modifier($id, $username, $email, $password);
/* Ensuite on pourrait raffraichir la page avec */
// header("refresh:0;");
/* Ou bien rediriger vers notre liste d'utilisateur */
header("location:listeUserController.php");
}
Mise à jour de la base de donnée (modèle)
Pour modifier un utilisateur, il nous faut en sélectionner un.
// on défini une fonction de sélection d'un utilisateur
function selectById($id){
// On appelle notre fonction connexion();
$pdo = connexion();
// On prépare notre requête SQL
$prep = $pdo->prepare(
'SELECT * FROM user WHERE id=:id'
);
// On exécute notre requête.
$prep->execute([
"id"=>$id
]);
// On retourne les informations trouvés.
return $prep->fetch();
}
Ici on se contentera de récupérer les informations donnée et mettre à jour le profil de l'utilisateur avec celles ci.
// On défini une fonction de modification de l'utilisateur.
function modifier($id, $username, $email, $password){
// On appelle notre fonction connexion();
$pdo = connexion();
/* On prépapre notre requête afin d'éviter les
injections SQL */
$prep = $pdo->prepare(
'UPDATE user SET username=:user,
email=:em, password=:pass WHERE id=:id'
);
/* On exécute notre requête avec les variables
passé en argument. */
$prep->execute([
"user"=>$username,
"em"=>$email,
"pass"=>$password,
"id"=>$id
]);
}
Note : Il serait bien plus propre de mettre à jour seulement les informations qui ont été modifié
et non de mettre à jour même celles qui sont identique.
Mais ce cours ayant pour but d'être simple, cet exemple ne compliquera pas plus le code.