Supprimer plusieurs lignes sélectionnées [Résolu]

Signaler
-
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
-
Bonjour à tous,

J'ai un souci au niveau de mon code pour la suppression d'une ligne sélectionnée.
En effet, j'aimerais quand je sélectionne une ligne dans mon tableau via une case à cocher d'arriver à la supprimer.
J'aimerais aussi sélectionner plusieurs lignes et les supprimer en même temps.
La suppression côté client marche mais côté serveur elle ne fonctionne pas. Je vous remercie par avance.

Code ci-dessous :

<div>
<a type="button" class="delete">Supprimer</a>
</div>
<div id="msg"></div>
<table>
<form method="post" action="delete.php">
<thead>
<tr>
<th><input type="checkbox" id="head"></th>
<th>Name</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<?php
// connexion à la Bd
require_once("db.php");

// requête
$sql = "SELECT * FROM cat ORDER BY cat_id DESC";
$req = $db->prepare($sql);
$req->execute() or die(print_r($req->errorInfo()));
$rows = $req->fetchAll();

foreach($rows as $row) {
?>
<tr data-row-id="<?=$row["cat_id"];?>">
<td><input type="checkbox" class="check" data-id="<?=$row["cat_id"];?>"></td>
<td><?=$row["cat_name"];?></td>
<td><a class="remove" data-id="<?=$row["cat_id"];?>" href="javascript: void(0)"><img src="supprimer.jpg" alt="supprimer"></a></td>
</tr>
<input type="hidden" name="cat_delete" value="<?=$row["cat_id"];?>">
<?php
}
?>
</tbody>
</form>
</table>


<script>
$(document).ready(function(){
$('#head').on('click', function(e) {
if($(this).is(':checked', true)) {
$(".check").prop('checked', true);
} else {
$(".check").prop('checked', false);
}
});

$('.delete').on('click', function(e) {
e.preventDefault();

var $this = $(this);
var cat_delete = $this.find('[name="cat_delete"]').val();
var all = [];

$(".check:checked").each(function() {
all.push($(this).attr('data-id'));
});

if(all.length <=0) {
alert("Veuillez sélectionner une ligne !");
} else {
var DELETE = "Voulez-vous vraiment supprimer cette ligne ?";
var check = confirm(DELETE);

if(check == true){
$.ajax({
type: "POST",
url: "delete.php",
cache:false,
data: $this.serialize(),
beforeSend: function() {
$this.after('<img src="loader.gif" alt="loading" id="loading">');
},
success: function(response) {
console.log(response);

$("#loading").hide();
$("#msg").html(response);
}
});

$.each(all, function(index, value) {
$('table tr').filter("[data-row-id='" + value + "']").remove();
});
}
}
});

$('.remove').on('click', function(e) {
var DELETE = "Voulez-vous vraiment supprimer cette ligne ?";
var check = confirm(DELETE);
if(check == true){
$('table tr').filter("[data-row-id='" + $(this).attr('data-id') + "']").remove();
}
});
});
</script>


// fichier delete.php
require_once("db.php");

$cat_delete = $_POST['cat_delete'];

if (isset($cat_delete)){
// requête
$q = array('cat_delete'=>$cat_delete);
$sql = "DELETE FROM cat WHERE cat_id = :cat_delete";
$req = $db->prepare($sql);
$req->execute($q) or die(print_r($req->errorInfo()));
}

4 réponses

Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
347
Bonjour,

Regarde côté ajax ...
  data: $this.serialize(),


Et côté php :
$cat_delete = $_POST['cat_delete'];



Ne vois tu pas l'erreur ?


Fais donc, côté php, un
 print_r($_POST);
. et regarde ce que ça t'affiche (dans la CONSOLE de ton navigateur)


Bonjour @jordane45,

Merci encore pour ta contribution.
En faisant ceci dans mon code :


// fichier delete.php
require_once("db.php");

$cat_delete = $_POST['cat_delete'];

if (isset($cat_delete)){
// requête
$q = array('cat_delete'=>$cat_delete);
$sql = "DELETE FROM cat WHERE cat_id = :cat_delete";
$req = $db->prepare($sql);
$req->execute($q) or die(print_r($req->errorInfo()));
} else {
echo 'erreur !';
}


J'ai l'erreur qui s'affiche mais un
print_r($_POST);
ne me revoie rien.

Cordialement,
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
347
J'ai l'erreur qui s'affiche

Quelle erreur ?

mais un print_r($_POST); ne me revoie rien

Ca te retourne au moins un ARRAY vide non ?
Comment "vérifies" tu ? Dans quel écran ?
=> Il faut regarder dans la console du navigateur au niveau de la requete ajax....


Pour les tests on va faire un truc en plus:
var datas = $this.serialize();
console.log(datas);
 $.ajax({   
                                 type: "POST",  
                                 url: "delete.php",  
                                 cache:false,  
                                 data: datas, 
                                 beforeSend: function() {
                                    $this.after('<img src="loader.gif" alt="loading" id="loading">');
                                }, 
                                 success: function(response) {
                                  console.log(response);   
 
                                     $("#loading").hide();  
                                     $("#msg").html(response);
                                 }   
                             });


Que donne ceci par exemple ?

La console m'affiche ceci : Notice: Undefined index: cat_delete in C:\www\delete.php on line 5
Utilisateur anonyme >
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021

Tu compliques trop les choses et tu tournes autour.
Ce que je cherche à comprendre c'est juste la manière de récupérer mon tableau en php.
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
347 > Utilisateur anonyme
Tu crois que je t'ai donné quoi comme code ????
Tu l'as testé au moins ?
Utilisateur anonyme >
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021

Je l'ai testé mais je n'ai rien comme résultat à part cette : TypeError: b is undefined

.........

var elm = $(this).find('[name="cat_delete"]').val();
var all = [];

if(check == true){
var datas = {elm:JSON.stringify(all)};
//console.log(datas);
$.ajax({
type: "POST",
url: "delete.php",
cache:false,
data: 'ref='+datas,
beforeSend: function() {
$this.after('<img src="loader.gif" alt="loading" id="loading">');
},
success: function(response) {
console.log(response);

$("#loading").hide();
$("#msg").html(response);
}
});

$.each(all, function(index, value) {
$('table tr').filter("[data-row-id='" + value + "']").remove();
});
}


// fichier delete.php
require_once("db.php");

$ref = $_POST['ref'];

if (isset($ref)){
foreach ($ref as $val) {
$q = array('ref'=>$val);
$sql = "DELETE FROM cat WHERE cat_id = :ref";
$req = $db->prepare($sql);
$req->execute($q) or die(print_r($req->errorInfo()));
}
} else {
echo 'erreur !';
}
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
347 > Utilisateur anonyme
Pourrais tu, le temps des tests .. modifier ton fichier php (delete.php) pour n'y mettre QUE ceci :
print_r($_POST);

et nous dire ce que ça te retourne dans la console ?
Car j'ai testé chez moi... et ça fonctionne parfaitement.
Utilisateur anonyme >
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021

Voilà ce que je trouve dans la console : ref : [objectObject]
et cette erreur : Conversion failed when converting the varchar value '[objectObject]' to data type int.

J'ai remplacé cette ligne :
var datas = {elm:JSON.stringify(all)};
par celle-ci :
var datas = all.join(",");
et ça marche maintenant.

Un autre petit souci ce que je n'arrive pas à supprimer plusieurs lignes sélectionnées en même temps. Si j'essaye de le faire voici l'erreur que ça m'affiche : Conversion failed when converting the varchar value '6,5' to data type int.
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
347
il faut que tu transformes cette liste en ARRAY, puis que dans ton code php tu BOUCLES dessus (comme je te l'avais indiqué dans un précédent message)
Messages postés
32446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 mai 2021
347
Tu aurais pu laisser le JSON.stringify
par contre côté PHP tu devais, pour récupérer ta variable en ARRAY faire :
<?php

//récupération de la variable POST
$elmarr = !empty($_POST['elm']) ? $_POST['elm'] : NULL;
//transformation en ARRAY
$arr_elm = json_decode(stripslashes($elmarr));


//boucle dessus
$result = 'ok';
foreach($arr_elm as $val){
  $q = array(':ref'=>$val);
  $sql = "DELETE FROM cat WHERE cat_id = :ref";
   try{    
       $req = $db->prepare($sql);
       $req->execute($q) ;
   }catch(Exception $e){
     //voila comment on gere les erreurs en PDO
      $result = "Error ! ".$e->getMessage();
   }
}


//renvoie des données en JSON vers le javascript
echo json_encode($result);


?>