8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je cherche à réaliser un petit script PHP qui va permettre de supprimer une actualité via son identifiant.

Jusque-là, j'ai vérifié si l'utilisateur a bien entré un identifiant (pas des lettres, pas de vide, un nombre positif). Actuellement, le script de suppression d'une ligne dans la table news fonctionne. Mais j'ai remarqué que si j'entre un identifiant qui n'existe pas dans la table, alors le script supprime rien mais affiche tout de même « votre actualité à bien été supprimée. »

Comment puis-je vérifier que l'identifiant saisi existe bien dans la table news ?

Voici quelques bouts de code :
if($_POST) {
   // Vérification de l'identifiant
   if(!empty($_POST['newstodelete']) && is_numeric($_POST['newstodelete']) && $_POST['newstodelete'] > 0) {

      require_once 'db_connect.php';

      $req = $pdo->prepare('DELETE FROM news WHERE id = ?'); // on supprime l'actualité dont l'identifiant est :
      $req->execute([$_POST['newstodelete']]);

      $_SESSION['flash_message']['success'] = "L'actualité à bien été supprimée.";
      header('Location: delete.php'); // On redirige l'utilisateur pour lui afficher le message
      exit();
   } else {
      $_SESSION['flash_message']['danger'] = "Vous devez entrer un indentifiant valide";
      header('Location: delete.php'); // On redirige l'utilisateur pour lui afficher le message
      exit();
   }
}
<div class="div__field">
        <label for="newstodelete" class="label__backOffice">Identifiant de l'actu à supprimer</label>
        <input type="number" name="newstodelete" min="0" class="input__backOffice">
    </div>

    <!-- Validation -->
    <input type="submit" value="Supprimer l'actualité" class="submit__backoffice">


Avez-vous une idée pour que l'utilisateur ne puisse pas entrer un identifiant d'une actualité qui n'existe pas dans la table news ?

Merci d'avance pour votre aide.
Modifié par SilverFox (06 Jul 2015 - 12:01)
Après ton delete, tu utilises la fonction
rowcount

si c'est égal à 1, c'est qu'une news a été supprimé; sinon c'est qu'il n'y avait pas de news portant cet id.


l'autre solution est à faire AVANT le delete : tu fais un select avec where id= et d'appliquer rowcount pour savoir s'il y a dans la table un résultat correspondant à l'id que tu veux supprimer.
Modifié par Lothindil (06 Jul 2015 - 12:38)
Merci de ta réponse.

Je comptais justement faire un SELECT mais je n'ai pas bien comprit le fonctionnement de rowcount.
rowcount permet de savoir le nombre de ligne qui a été affecté.

Sur un delete, un insert ou un update, ça te retournera le nombre de ligne que tu as supprimé/ajouté/modifié

sur un select, ça devrait te retourner le nombre de lignes que tu as sélectionné.

(et attention, ça dépend de la connexion mysql et non de la requête. C'est donc la dernière requête faite qui compte)
Modifié par Lothindil (06 Jul 2015 - 12:54)
Si j'ai bien compris, une fois la ligne retournée, je pourrais récupérer et comparer les identifiants en question ?

je vais faire des tests, je reviens pour dire quoi.
non, une fois que tu auras recherché dans la table, ton résultat contiendra (si tu as bien défini id comme étant une clé primaire ou au moins une clé d'unicité) soit 0 soit 1 résultat.

Donc le nombre de ligne touché par ton select, sera soit 0 si tu n'as pas de news portant cet id; soit 1 si tu as une news portant cet id.


Si tu utilises rowcount après le delete, ça sera le même principe (mais cela t'évitera une requête pour rien). Si rowcount te retourne 0, c'est que tu n'as supprimé aucune ligne et donc qu'il n'y avait pas de news portant cet id; si rowcount te retourne 1, c'est que tu viens de supprimer une ligne et donc qu'il y avait une news portant cet id.
Aah ! D'accord !

J'ai compris !!
En fait, si l'utilisateur entre un identifiant qui existe dans la table news, rowcount va retourner 1 sinon, il retournera 0. Je dois donc simplement faire une condition if/else pour tester si une actualité a bien été supprimée.

Mon code PHP :
if ($_POST) {

    /**
     * On vérifie si l'identifiant de l'actualité saisi par l'utilisateur
     * n'est pas vide, est de type numérique et est supérieur à 0.
     * 
     * Si oui, alors on vérifie si l'actualité a bien été supprimée avec rowCount
     **/

    if (!empty($_POST['newstodelete']) && is_numeric($_POST['newstodelete']) && $_POST['newstodelete'] > 0) {

        require_once 'inc/db_connect.php';

        // Je prépare ma requête :
        $req = $pdo->prepare('DELETE FROM news WHERE id = ?');
        $req->execute([$_POST['newstodelete']]);

        if ($req->rowCount() == 0) { // Je vérifie s'il y a bien eu une suppression :

        // Aucune suppression n'a eu lieu car rowCount() retourne 0
            $_SESSION['flash_message']['danger'] = "L'actualité demandé n'existe pas.";
            header('Location: newschanges.php');
            exit();

        } else {

            // Une suppression a bien eu lieu car rowCount() ne retourne pas 0
            $_SESSION['flash_message']['success'] = "L'actualité a bien été supprimée.";
            header('Location: newschanges.php');
            exit();

        }

    } else {

        // Mauvaise saisie de l'utilisateur

        $_SESSION['flash_message']['danger'] = "L'identifiant saisi est incorrect.";
        header('Location: newschanges.php');
        exit();

    }

}


Merci de m'avoir aide Smiley smile
attention, ce n'est pas sur $req que va s'appliquer le rowcount, il dépend du marqueur de connexion, pas de la requête. (il devrait donc être sur l'instance $pdo)