Astuce #5: Suppression de données de votre base de manière contrôlée

Dans cette vidéo tutorielle, le présentateur montre comment ajouter une fonctionnalité de suppression d’enregistrements à une page PHP déjà utilisée pour la pagination. Il commence par placer des icônes PNG comme liens de suppression, puis explique comment transmettre l’identifiant de la ligne (ID) et un paramètre de contrôle (sup=oui) via l’URL. Le script PHP récupère ces paramètres, vérifie que le drapeau sup vaut « oui », puis exécute une requête DELETE préparée avec le ID. Il ajoute ensuite une boîte de confirmation JavaScript (confirm) pour éviter les suppressions accidentelles. Le présentateur montre comment garder l’utilisateur sur la même page de pagination après la suppression en transmettant le numéro de page courant dans l’URL. Enfin, il illustre une protection basique contre les suppressions directes en vérifiant la variable superglobale SERVERHTTPREFERER pour s’assurer que la requête provient bien de la page de pagination. Il conclut en rappelant que cette méthode n’est pas totalement sécurisée et recommande l’usage de tokens, timestamps ou autres mécanismes de sécurité plus robustes.
Chapters
Bonjour à tous, et bienvenue dans cette nouvelle vidéo consacrée à une nouvelle astuce de développement web. Aujourd'hui, nous allons voir comment supprimer des enregistrements dans une base de données à travers une page PHP. Nous allons travailler sur le même code que nous avons développé avant, et qui concerne la pagination. L'idée c'est de supprimer ces enregistrements dans la base de données à travers la page courante. On va donc placer des boutons ou bien des liens qui vont nous permettre de supprimer les éléments souhaités. Moi je vais opter pour des icônes PNG qui vont faire office de boutons de suppression. Le code qu'il y a sur la pagination est toujours le même. On va essayer de le modifier afin qu'il puisse prendre en charge la suppression. Donc je vais inclure mon image ici, comme ça. Voilà. Maintenant, je vais placer chacune de ces images dans un lien hypertexte qui va cibler la page de suppression, qui n'est rien d'autre que la page courante. Donc là, quand je clique, il se passera rien, je serai juste redirigé vers la page courante comme ceci. Le principe de la suppression est le suivant: quand je clique sur un bouton, il faut que j'indique à la page quel élément que je veux supprimer. Dans ce cas, je vais juste utiliser le ID et Qui est dans ce cas la clé primaire qui permet d'identifier l'enregistrement dans la table. Et c'est lui qui va me permettre de cibler l'élément que je veux supprimer. Alors je vais l'ajouter ici en tant que paramètre que j'appellerai ID. Et je l'intègre de cette façon. Il suffit de copier ce code. À la place de article, je mets ID. Exécutons. Donc maintenant quand je clique sur le premier lien, vous constatez bien que le ID a été transféré. Dans ce cas il vaut la valeur 1. Voilà, 2 pour le B, etc. Mais en plus de l'ID, il faut aussi passer un paramètre qui va dire à la page que je souhaite procéder à la suppression. Je vais appeler ce paramètre sup auquel je donnerai la valeur oui. Réexécutons. Dans ce cas, quand je clique sur le premier bouton, je passe le paramètre ID qui vaut 1 et SUP qui vaut oui. Alors là, je vais procéder à la suppression via le code PHP. Donc je vais placer mon bloc ici avant l'affichage. Je vais récupérer le ID via le GET. Et aussi sup comme ça. Maintenant je vais vérifier la valeur de sup. Si c'est égal à 8, ça veut dire que je vais procéder à la suppression. Maintenant il suffit de déclarer la requête de suppression comme ceci, que j'appellerai del pour dire delete. Je vais spécifier la valeur du marqueur interrogatif lors de l'exécution. Dans ce cas, c'est ID. Exécutons pour voir. Donc quand je clique sur le premier élément, on voit bien qu'il a été supprimé. Il ne reste plus que 25 enregistrements dans la table. Même chose pour le B, etc. Alors on constate bien que ça marche. Mais comme vous le savez, la suppression est une action irréversible, c'est-à-dire qu'au moment du clic sur le bouton, il faut bien demander la confirmation de l'utilisateur parce que c'est possible qu'il clique sur le bouton accidentellement et du coup il va s'ensuivre la suppression qui va générer des dégâts. Pour la vérification, on peut faire ça avec du PHP qui est mieux, mais ça nous demandera un peu plus de code. Donc je vais opter pour le JavaScript. Alors sur le lien de la suppression, je vais juste ajouter un événement onclick et je mettrai l'utilisateur, la méthode confirm et je vais afficher un message. Voulez-vous continuer? Par exemple. Exécutons. Une fois je clique, il y a la boîte de dialogue confirme qui s'affiche. Quand je mets annuler, la suppression ne s'effectue pas. Et quand je mets OK, dans ce cas la suppression est effectuée. Comme je l'ai dit avant, vaut mieux procéder à la vérification avec du PHP, c'est plus sûr. Mais juste pour gagner du temps, j'ai fait avec du JavaScript pour vous montrer un exemple. Maintenant imaginez que je suis sur la page 3. Et je vais par exemple supprimer ça. Vous constatez que la suppression est effectuée mais je suis redirigé directement vers la page 1 alors que je devrais rester sur la page 3. Dans ce cas, il suffit de passer avec les paramètres le numéro de la page courante que je vais mettre ici. Page égale la valeur de la variable page qui est générée en PHP. Actualisons. Maintenant je suis sur la page 3. Quand je fais comme ça, on constate bien que cet enregistrement est supprimé et je suis resté sur la page 3. Donc jusqu'ici ça marche bien. Une dernière chose, imaginez que je veux procéder à la suppression sans cliquer sur le bouton. Par exemple, je veux supprimer l'enregistrement numéro 14 dans ce cas qui correspond à N. Alors je vais juste copier ce lien, je vais le coller ici et je change le ID Je mets la valeur 14. Maintenant, quand je clique, la suppression est bien effectuée. Regardez la page où j'étais avant, elle contenait 21 enregistrements et maintenant je n'ai que 20. Alors cet enregistrement est supprimé. Regardez, bon, quand j'actualise, il a bien été supprimé. En fait, ça c'est une mauvaise pratique parce qu'il se peut que quelqu'un qui connaît le lien de suppression exécute celle-ci directement sans passer par cette page. Alors pour contrer ça, donc il y a plusieurs solutions. La plus connue d'ailleurs, c'est utiliser un token de sécurité, mais ça nous demandera du travail supplémentaire. Donc la solution que l'on va choisir, c'est de vérifier est-ce que l'utilisateur a bien cliqué sur le bouton. Autrement dit, est-ce que l'utilisateur était déjà sur la page courante, ça veut dire index.php, avant de procéder à la suppression? C'est-à-dire qu'il n'a pas atterri sur la page de suppression directement sans passer par cette page-là, qui est la même d'ailleurs. Donc il suffit de vérifier la variable superglobal SERVER_HTTP_REFERER. En guise de rappel, je vais l'afficher ici. J'ai déjà expliqué cette famille de variables dans la leçon consacrée aux variables d'environnement PHP. HTTP_REFERER est censé nous retourner la page précédente, c'est-à-dire la page sur laquelle j'ai été avant d'atterrir sur la page courante. Exécutons. Donc là, ça m'affiche pagination/index.php, etc. Bon, le plus important pour moi, c'est de vérifier juste est-ce que le lien contient la chaîne de caractères pagination/index.php pour prouver que j'ai été sur cette page avant. Donc maintenant, imaginez que j'ai copié ce lien et que j'exécute directement, c'est-à-dire sans passer par cette page au préalable. Dans ce cas, ça n'affiche rien. C'est-à-dire que le serveur sait bien est-ce que j'ai été sur cette page avant ou bien j'ai atterri sur celle-ci directement en saisissant son URL par exemple. Donc comme je l'ai dit, je vais juste vérifier est-ce que cette chaîne pagination/index.php figure dans nos HTTP referrer avant de procéder à la suppression. On va le faire ici. Voilà, je vais ajouter comme condition AND reg_match et ça c'est la chaîne à vérifier. Notez que le point est un caractère spécial des expressions régulières, alors il faut donc y se lâcher comme ça. Alors maintenant si l'utilisateur est déjà passé par cette page avant, la suppression sera effectuée, sinon il sera ignoré. Exécutons. Bon, j'ai une petite notification, je vais juste la masquer avec l'arobase comme d'habitude. Voilà, on va supprimer par exemple l'enregistrement R. C'est bon, c'est supprimé. Maintenant on va prendre le ID de l'enregistrement S. Il vaut 19. Alors je vais copier ce lien et je vais l'exécuter directement en changeant la valeur. De l'ID, j'exécute, on voit bien que ce n'est pas supprimé. Bien que le lien est correct, mais la suppression est ignorée parce que la condition du HTTP referrer n'est pas vérifiée. Par contre, si je suis déjà sur la page et que je procède à la suppression en cliquant sur le bouton, dans ce cas ça marche. Bien sûr, cette méthode ne garantit pas la sécurité maximale. Comme j'ai dit tout à l'heure, il faut penser à utiliser des méthodes qui sont plus avancées comme les tokens de sécurité, les timestamps, etc. Mais ça, c'est au moins un point de départ afin de contrôler la suppression ou les actions qui sont irréversibles en général sur votre page web. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









