Fonction delete qui ne marche pas

Résolu
max30_3775 Messages postés 185 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, je sollicite votre aide car je cherche à effacer une annonce avec ses images (de la bdd et du serveur).
En cliquant sur supprimer, rien ne se passe.
Voici l'intégralité du code:
<?php 

session_start();
include "../cnx.php";
include "../header.php";



function deleteannonce($idannonce){
  global $bdd;
$sql= "DELETE A, I
From annonces A
LEFT JOIN I images_annonces ON I.id_annonce=A.id
WHERE A.id= ".$idannonce."
";

$req = $bdd->prepare($sql);
$req->execute($idannonce);

return $req;
}


//On récupère un array des filepath d'une annonce
function getAllImgByIdAnnonce($idannonce){
  global $bdd;
  $sql = "SELECT filepath FROM images_annonces WHERE id_annonce=?";
  $datas = array($idannonce);


  try{

    $req = $bdd -> prepare($sql) ;
    $res = $req->execute($datas) ;


    return $req->fetchAll(PDO::FETCH_COLUMN); //on retourne le resultat en Array
  }catch(Exception $e){
      // en cas d'erreur :
      echo " Erreur ! ".$e->getMessage();
      echo " Les datas : " ;
      print_r($datas);
  }  
  
}
// On supprime les photos sur le serveur et en bdd

function deleteOldPhoto($idannonce,$location="../pictures/"){
    
  //on récupère la liste des photos existantes en bdd
  $imgs = getAllImgByIdAnnonce($idannonce);

  
  //on boucle dessus pour les supprimer sur le serveur 
  foreach($imgs as $img){
    @unlink($location.$img);
  }
  
  //on supprime les images dans la bdd
  return deleteannonce($idannonce);
  
}



if(isset($_POST['supprimer'])){

  $idannonce= ($_GET["id"]);
  $suprimer=deleteannonce($idannonce);
  deleteOldPhoto($idannonce,$location="../pictures/");



header("Location: /membre/profilannonce.php");


}

?>


<!DOCTYPE html>
<html lang="fr">
<head>
<style>
        .alert-warning{
            margin-top: 100px;
        }
        </style>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <title>Document</title>
</head>
<body>
    
<div class="alert alert-warning">
    <strong>Attention!</strong> Vous êtes sur le point de supprimer cette annonce. Cliquez sur supprimer pour continuer: 
    <input type="submit" name="supprimer" value="supprimer">

  </div>

</body>

</html>

Voici l'url de la page: http://projetsite/membre/supprimerannonce.php?id=5
Auriez-vous une solution?

7 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour
    Commence par mettre ta requête dans un bloc try/catch
    Et retire la redirection...
    Regarde ce que ça t'affiche..
    Ah... Et montre nous le code html quu va avec ton bouton de suppression
    1
  2. max30_3775 Messages postés 185 Statut Membre
     
    Bonjour Jordane, c'est fait le bloc try/catch a été ajouté dans la requête, et la redirection enlevée:
    <?php 
    
    session_start();
    include "../cnx.php";
    include "../header.php";
    
    
    
    function deleteannonce($idannonce){
      global $bdd;
    $sql= "DELETE A, I
    From annonces A
    LEFT JOIN I images_annonces ON I.id_annonce=A.id
    WHERE A.id= ".$idannonce."
    ";
    try{
    $req = $bdd->prepare($sql);
    $req->execute($idannonce);
    
    }catch(Exception $e){
      echo " Erreur ! ".$e->getMessage();
      echo " Les datas : " ;
      print_r($req);
    
    }
    
    return $req;
    }
    
    
    //On récupère un array des filepath d'une annonce
    function getAllImgByIdAnnonce($idannonce){
      global $bdd;
      $sql = "SELECT filepath FROM images_annonces WHERE id_annonce=?";
      $datas = array($idannonce);
    
    
      try{
    
        $req = $bdd -> prepare($sql) ;
        $res = $req->execute($datas) ;
    
    
        return $req->fetchAll(PDO::FETCH_COLUMN); //on retourne le resultat en Array
      }catch(Exception $e){
          // en cas d'erreur :
          echo " Erreur ! ".$e->getMessage();
          echo " Les datas : " ;
          print_r($datas);
      }  
      
    }
    // On supprime les photos sur le serveur et en bdd
    
    function deleteOldPhoto($idannonce,$location="../pictures/"){
        
      //on récupère la liste des photos existantes en bdd
      $imgs = getAllImgByIdAnnonce($idannonce);
    
      
      //on boucle dessus pour les supprimer sur le serveur 
      foreach($imgs as $img){
        @unlink($location.$img);
      }
      
      //on supprime les images dans la bdd
      return deleteannonce($idannonce);
      
    }
    
    
    
    if(isset($_POST['supprimer'])){
    
      $idannonce= ($_GET["id"]);
      $suprimer=deleteannonce($idannonce);
      deleteOldPhoto($idannonce,$location="../pictures/");
    
    
    
    }
    
    ?>
    
    
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <style>
            .alert-warning{
                margin-top: 100px;
            }
            </style>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
        <title>Document</title>
    </head>
    <body>
        
    <div class="alert alert-warning">
        <strong>Attention!</strong> Vous êtes sur le point de supprimer cette annonce. Cliquez sur valider pour continuer: 
        <input type="submit" name="supprimer" value="supprimer">
    
      </div>
    
    </body>
    
    </html>
    


    Le code html:
    
    
    
      <style>
          /*/photo header*/
    
          html,
    body {
      margin: 0;
      padding: 0;
    }
    /* ------------------------------- */
    /* MENU */
    #menu {
      position: relative;
      width: 100%;
      
    }
    #menu ul,
    #menu li,
    #menu li a {
      position: relative;
      margin: 0;
      padding: 0;
      box-sizing:border-box;
      list-style: none;
      z-index:1;
    }
    #menu ul {
      width: 100%;
      background:#FFA500;/*orange*/
      font-weight: bold;
    }
    #menu ul li a {
      display: block;
      color:#873600;/*dark orange*/
      padding: 20px 30px;
      position: relative;
      text-decoration: none;
      height:100%;
    }
    /* --------------- */
    /* MENU : niveau 1 */
    #menu nav > ul > li > a {
     color: white;
    }
    /* --------------- */
    /* MENU : niveau 2 */
    #menu ul ul {
      color:white;
      background:#f4d03f;/*jaune-orange*/
    }
    #menu ul ul li > a {
      padding: 15px 30px;
      font-size: 10px bold;
      color:white;/*dark orange*/
    }
     
    /* --------------- */
    /* HOVER : afficher/masquer les SOUS-MENUS*/
    #menu ul li > ul {
      display: none; /*on masque le SOUS-MENU*/
    }
    #menu ul li:hover > ul {
      display: block; /*on affiche le SOUS-MENU*/
    }
    #menu nav > ul > li.active > a, /* MENU : niveau 1 ACTIF */
    #menu ul li:hover > a {
      color:#21618c;/*bleu*/
      background: silver;
    }
    #menu nav > ul > li.active > a:before, /* MENU : niveau 1 ACTIF */
    #menu nav > ul > li:hover > a:before {
      position:absolute;
      content:'';
      display:block;
      top:0; left:0;
      width:100%;
      height:5px;
      background:#f4d03f;/*jaune-orange*/
    }
     
    /* ---------- responsive  --------- */
    /* DESKTOP : menu horizontal */
    @media screen and (min-width: 769px) {
      #menu nav > ul {
        display: -webkit-flex;
        display: flex;
      }
      /*  niveau 1 */
      #menu nav > ul > li {
        -webkit-flex: 1 1 1%; /* astuce : 1% pour même largeur */
        flex: 1 1 1%;
      }
      #menu nav > ul > li > a {
      }
      /*  niveau 2  */
      #menu nav > ul ul {
        position: absolute;
        width: 200%;
      }
    }
    /* ------------------------------- */
    /* PHONE : menu vertical */
    @media screen and (max-width: 768px) {
      #menu {
        width: 100%;
        margin:0 auto;
        height:7px;
      }
    }
    /* ------------------------------- */
    /* MENU*/
    nav input[type=checkbox],
    nav label {
      display:none;
    }
    @media screen and (max-width: 768px) {
      /* input */
      input#menu-mobile {
        position: absolute;
        /*xxleft: -9999em;*/
        opacity:0; /* invisible */
      }
      label[for="menu-mobile"] {
        display: block;
        text-indent: .25em;
        background: #EEE;
        border: 1px solid #CCC;
        margin: 1px;
        cursor: pointer;
        height:48px;
        line-height:48px;
      }
      label[for="menu-mobile"]:before {
        content: "\2630";  
        display: block;
        position: absolute;
        top: 0;
        right: 0;
        width: 1em;
        text-align: center;
        text-indent: 0;
        font-size: 1em;
        font-weight: bold;
        color: #069;
      }
      /* on traite la liste menu */
      #menu-mobile:not(:checked) ~ ul {
        display: none;
        position: absolute;
        left: -1px;
        width: 100%;
        margin: 0;
        padding: 0;
        border: inherit;
        background: #FFF;
      }
      #menu-mobile:checked ~[for="menu-mobile"]:before {
        content: "\2716";
      }
    }
    .col-sm-6{
    flex: 0 0 50%;
        flex-grow: 0;
        flex-shrink: 0;
        flex-basis: 50%;
        max-width: 50%;
    }
    
    .depot {
         color: white;
         text-decoration: none;
         outline: none !important;
    }
    
    
    .submit_bt{
      position: absolute;
      right: 20px;
         font-size: 14pt; 
         color: #ffffff;
         background-color: #69c934;
         border: 0px;
         height: 50px;
         padding: 0px 20px;
         margin-top: 30px;
    }
    
    .white-color{
      color: white;
    }
     
     .maquette{
       color: black;
     }
    
    .submit_bt a:hover{ color: #000; }
    
    .search_main{ width: 78%; float: right; }
    
    
    
    
    .sousnav{
        display: grid;
        grid-template-columns: 1fr 5fr 5fr 5fr;
        grid-template-rows: 1fr 20fr 20fr;
        grid-template-areas:
            "lo social connect connect"
            "lo social lg search"    ;
        height: 100px;
        margin-top: 45px;
    }
    
    .nav-item{
        grid-area: connect;
        display: flex; /* on remet en flex */
        justify-content :flex-end; /* on aligne les items dans flex*/
    
        height: 30px;
        font-weight:bold;
    margin-right:10px;
    
        
      
    }
    
    .nav-item i{
      padding-left:15px;
    }
    
    .search_main{
        grid-area: search;  
        display: flex; /* on remet en flex */
        justify-content :flex-end; /* on aligne les items dans flex*/
        padding-right: 20px;  
        margin-top:10px;
    }
    
    .socialmedia{
        grid-area: social;
        display: flex; /* on remet en flex */
        justify-content: center;
        width: 110px;
        height: 30px;
    
    
        padding-left:10px;
     
    }
    
    .socialmedia i{
        padding-right:10px;
    }
    
    .nav-link{
     color:black;
     text-decoration: none;
      outline: none !important;
      
    }
    .logo{
      grid-area: lo;
      background: url('/lewedli.jpg');
      background-repeat:no-repeat;
      width: 140px;
      height: 125px;
      display:flex;
        align-items: start;
        margin-bottom: 20px;
        
    }
    
    
    
    .LatinLanguage{
        grid-area: lg;
        display: flex; /* on remet en flex */
        justify-content: center;
    height:30px;
        width: 180px;
        margin-top: 10px;
    
    }
    
    .langues{
      color: blue;
      font-weight: bold;
      margin-left:5px;
      font-size: 12px;
      text-decoration: none;
      outline: none !important;
    }
    
    
    
    
    
    /*Bouton*/
    
    /*.styled {
      border: 0;
      line-height: 2.5;
      padding: 0 20px;
      font-size: 1rem;
      text-align: center;
      color: #fff;
      text-shadow: 1px 1px 1px #000;
      border-radius: 10px;
      background-color: #FFA500;
      background-image: linear-gradient(to top left,
                                        rgba(0, 0, 0, .2),
                                        rgba(0, 0, 0, .2) 30%,
                                        rgba(0, 0, 0, 0));
      box-shadow: inset 2px 2px 3px rgba(255, 255, 255, .6),
                  inset -2px -2px 3px rgba(0, 0, 0, .6);
    }
    
    .styled:hover {
      background-color: #008000;
    }
    
    .styled:active {
      box-shadow: inset -2px -2px 3px rgba(255, 255, 255, .6),
                  inset 2px 2px 3px rgba(0, 0, 0, .6);
    }
    
    .icons{
    text-align: right;
    vertical-align: 30px;
    padding: 0px;
    margin-right: 20px
    }
    
    .boutons{
    text-align: right;
    vertical-align: 50px;
    padding: 20px;
    }*/
    
    
          </style>
    
    <header>
    <div id= "containermenu">
    <div id= "rowmenu">
    
    <div id="menu">
    <nav>
      <label for="menu-mobile" class="menu-mobile">Menu</label>
      <input type="checkbox" id="menu-mobile" role="button">
    
      <ul> <li class='menu'><a href="/index.php">Accueil</a>
    
     <li class='menu'><a href='/principales/affichage.php?id=1'>Immobilier</a><ul><li class='submenu'><a href='/principales/affichage.php?id=101'>Vente de Maisons </a></li><li class='submenu'><a href='/principales/affichage.php?id=102'>Location de Maison </a></li><li class='submenu'><a href='/principales/affichage.php?id=103'>Vente Appartement </a></li><li class='submenu'><a href='/principales/affichage.php?id=104'>Location Appartement </a></li><li class='submenu'><a href='/principales/affichage.php?id=105'>Bureau </a></li><li class='submenu'><a href='/principales/affichage.php?id=106'>Terrain </a></li></ul></li><li class='menu'><a href='/principales/affichage.php?id=2'>Véhicules</a><ul><li class='submenu'><a href='/principales/affichage.php?id=201'>Voitures </a></li><li class='submenu'><a href='/principales/affichage.php?id=202'>Motos </a></li><li class='submenu'><a href='/principales/affichage.php?id=203'>Pièces et Accessoires pour Véhicules </a></li><li class='submenu'><a href='/principales/affichage.php?id=204'>Vélos </a></li><li class='submenu'><a href='/principales/affichage.php?id=205'>Véhicules Professionnels </a></li></ul></li><li class='menu'><a href='/principales/affichage.php?id=3'>Multimédia</a><ul><li class='submenu'><a href='/principales/affichage.php?id=301'>Téléphones </a></li><li class='submenu'><a href='/principales/affichage.php?id=302'>Télévisions </a></li><li class='submenu'><a href='/principales/affichage.php?id=303'>Ordinateurs Portables </a></li><li class='submenu'><a href='/principales/affichage.php?id=304'>Accessoires Informatiques </a></li><li class='submenu'><a href='/principales/affichage.php?id=305'>Ordinateurs de Bureaux </a></li></ul></li><li class='menu'><a href='/principales/affichage.php?id=4'>Cours</a><ul><li class='submenu'><a href='/principales/affichage.php?id=401'>Cours Individuels </a></li><li class='submenu'><a href='/principales/affichage.php?id=402'>Cours Collectifs </a></li></ul></li><li class='menu'><a href='/principales/affichage.php?id=5'>Agriculture</a><ul><li class='submenu'><a href='/principales/affichage.php?id=501'>Vente de terrain agricole </a></li><li class='submenu'><a href='/principales/affichage.php?id=502'>Location de terrain agricole </a></li><li class='submenu'><a href='/principales/affichage.php?id=503'>Vente de tracteurs </a></li><li class='submenu'><a href='/principales/affichage.php?id=504'>Location de tracteurs </a></li></ul></li><li class='menu'><a href='/principales/affichage.php?id=20'>Autres...</a><ul></ul></li></ul>
    </nav>  
    </div>
    
    
    
    
    <div class= "sousnav">
    
    
     
            <div class="nav-item">
                    <a class="nav-link" href="/membre/profil.php">
                      <i class="fa fa-user" aria-hidden="true"></i>
                      <span>
                      mol                  </span>
                    </a>
            
                    <a class="nav-link" href="/membre/deconnexion.php">
                      <i class="fa fa-user" aria-hidden="true"></i>
                      <span>
                      Déconnexion                  </span>
                    </a>
    </div>
    
    
    <div class="search_main">
                        <button class="submit_bt"><a class='depot' href="/principales/formannonce.php"><span class="doctor"><i class='fa fa-plus white-color'></i></span> Déposer une annonce</a></button>
    				    </div>
    
    
    
                <div class="socialmedia">
    <a href="#"><i class="fab fa-facebook-f "></i></a>
      	 				<a href="#"><i class="fab fa-twitter"></i></a>
      	 				<a href="#"><i class="fab fa-instagram"></i></a>
      	 				<a href="#"><i class="fab fa-linkedin-in"></i></a>
    
    </div>
    
    
    
    <div class="logo"></div> 
    
    
    <div class ="LatinLanguage">
    
    
    <div class="language">
    <i class="fa fa-globe" aria-hidden="true"></i>
    <a class= "langues" href="/index.php?lang=fr"> Français </a>
    <a class= "langues" href="/index.php?lang=en">English </a>
    </div>
    
    </div>
    
    
    
    </div>
    
    
    
    
    
    
    </header>
    
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <style>
            .alert-warning{
                margin-top: 100px;
            }
            </style>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
        <title>Document</title>
    </head>
    <body>
        
    <div class="alert alert-warning">
        <strong>Attention!</strong> Vous êtes sur le point de supprimer cette annonce. Cliquez sur valider pour continuer: 
        <input type="submit" name="supprimer" value="supprimer">
    
      </div>
    
    </body>
    
    </html>
    
    0
    1. max30_3775 Messages postés 185 Statut Membre
       
      Rien ne se passe lorsque le bouton est cliqué
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > max30_3775 Messages postés 185 Statut Membre
         
        Comment peux tu avoir une balise <!Doctype à la ligne 423 alors que tu as déjà du html avant ?? ( en gros, tes lignes 423 à 439 n'ont rien à faire à cet endroit ! )
        En plus ton bouton.. il n'est pas dans un <form> .. donc normal qu'il ne se passe rien !
        0
  3. max30_3775 Messages postés 185 Statut Membre
     
    Tu veux dire qu'il faut un if(isset($_GET['supprimer']) ? Si oui, je l'ai fait. Le bouton est toujours incliquable
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Non.. je parles des balises form...
      A moins que tu ne veuilles faire qu'un lien...
      1
  4. max30_3775 Messages postés 185 Statut Membre
     
    D'accord, j'ai ajouté dans un form:
    <div class="alert alert-warning">
    <form action="" method="POST">
        <strong>Attention!</strong> Vous êtes sur le point de supprimer cette annonce. Cliquez sur supprimer pour continuer: 
      
        <input type="submit" name="supprimer" value="supprimer">
          </form>
      </div>

    Le bouton marche, mais il affiche l'erreur suivante:
    Warning: PDOStatement::execute() expects parameter 1 to be array, string given in C

    Il s'agit du $req execute($idannonce):
    function deleteannonce($idannonce){
      global $bdd;
    $sql= "DELETE A, I
    From annonces A
    LEFT JOIN I images_annonces ON I.id_annonce=A.id
    WHERE A.id= ".$idannonce."
    ";
    try{
    $req = $bdd->prepare($sql);
    $req->execute($idannonce);
    
    }catch(Exception $e){
      echo " Erreur ! ".$e->getMessage();
      echo " Les datas : " ;
      print_r($req);
    
    }
    
    return $req;
    }
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      bonjour,
      as-tu compris le message d'erreur?
      dans cette même discussion, tu nous as montré un autre code qui utilise execute() et qui fonctionne bien. as-tu comparé les deux?
      1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. max30_3775 Messages postés 185 Statut Membre
     
    Bonjour yg_be, tu as raison, maintenant ça marche:
    function deleteannonce($idannonce){
      global $bdd;
    $sql= "DELETE A, I
    From annonces A
    LEFT JOIN images_annonces I ON I.id_annonce=A.id
    WHERE A.id= ".$idannonce."
    ";
    $datas=array($idannonce);
    try{
    $req = $bdd->prepare($sql);
    $req->execute($datas);
    
    }catch(Exception $e){
      echo " Erreur ! ".$e->getMessage();
      echo " Les datas : " ;
      print_r($req);
    
    }
    
    return $req;
    }


    Merci à vous :)
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      ...et ta requête DELETE reste très imparfaite: ne vois-tu pas d'autres différence entre les deux?
      0
  7. max30_3775 Messages postés 185 Statut Membre
     
    tu veux dire que le return $req doit être dans le try?
    try{
    $req = $bdd->prepare($sql);
    $req->execute($datas);
    return $req;
    //suite
    ;
    0
    1. max30_3775 Messages postés 185 Statut Membre
       
      correction:
      try{
      $req = $bdd->prepare($sql);
      $res= $req->execute($datas);
      return $res;
      //suite...
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > max30_3775 Messages postés 185 Statut Membre
         
        c'est la requête elle-même qui est mal construite.
        0
  8. max30_3775 Messages postés 185 Statut Membre
     
    Mais elle marche, à moins qu'il n'ait des surprises plus tard.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Elle marche, cependant tu n'as pas correctement construit la requête, tu l'as ajoutée dans le texte de la requête, au lieu de l'ajouter via le execute.
      0