Effacer plusieurs enregistrements d'une table mysql via checkbox Par Burnside
le mercredi 24 septembre 2008, 10:26Bonjour,
Voici comment effacer plusieurs enregistrements d'une table mysql via des checkbox,
soit vous effacez tout soit vous sélectionnez les enregistrements à effacer.
On crée un nouveau fichier php, on y place le code suivant pour se connecter à la base de données.
<?php
$host="localhost"; //serveur
$login="root"; //login sql
$password=""; // mot de pass sql
$base=""; // nom de la base
mysql_connect($host,$login,$password) or die(mysql_error());
mysql_select_db($base);
?>Ensuite on va placer la structure de notre code html, en dessous vous placez ce code :
<!DOCTYPE html PUBLIC "-//W3C//Dspan XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/Dspan/xhtml1-transitional.dspan">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
<body>
<form name="FormName" action="" method="post">
<div>
<span align="center"><input type="checkbox" name="CheckAll" id="CheckAll" value="1" onClick="checkAll(FormName)">Check all</span>
<span align="center"><strong>Titre</strong></span>
<span align="center"><strong>Date Ajout</strong></span>
</div>
<div>
<span align="center"><input type="checkbox" name="to_del[]" value="id"></span>
<span>Titre</span>
<span>Date</span>
</div>
<div>
<span colspan="5" align="center"><input type="submit" value="Delete" name="Delete"> <input type="reset" value="Reset" /></span>
</div>
</form>
<br />
</body>
</html>Voilà nous avons la structure pour continuer notre travail.
Nous allons ajouter la requête qui liste les sujets :
<?php
$query = "SELECT * FROM table ORDER BY id DESC";
$result = mysql_query($query);
while ($rows = mysql_fetch_assoc($result)){
if ($i % 2 == 0){?>
<span><input type="checkbox" name="to_del[]" value="<?php echo $rows["id"];?>"></span>
<span><?php echo $rows['Titre']; ?></span>
<span><?php echo $rows['Date_ajout']; ?></span>
</div>
<?php }else{ ?>
<div>
<span align="center" bgcolor="#E6EEF4"><input type="checkbox" name="to_del[]" value="<?php echo $rows["id"];?>"></span>
<span><?php echo $rows['Titre']; ?></span>
<span><?php echo $rows['Date_ajout']; ?></span>
</div>
<?php }
$i++;
}
?>Ici notre requête affiche une checkbox à côté de chaque objet de la table et change la couleur de chaque ligne via un modulo.
Placez ce code dans le deuxième div.
Maintenant il faut gérer la suppression.
Il faut récupérer toutes les checkbox et les passer dans une variable.
<?php
if($_POST['Delete']=='Delete') {
//Declaration auto des variables
foreach($_POST as $k => $v){
$$k = $v;
}
//Parcours du tableau des items qui doivent être supprimés
foreach($to_del as $v){
mysql_query("DELETE FROM table where id='$v'");
}
echo "<meta http-equiv=\"refresh\" content=\"0;URL=index.php\">";
}
?>Placez ce code après la balise </form> du code html.
Il ne reste plus que la fonction javascript qui va faire tourner tout ça :
<script type="text/javascript">
function checkAll(field) {
if (field.CheckAll.checked == true) {
for (i = 0; i < field.length; i++) {
if (field[i].name == "to_del[]"){
field[i].checked = true;
}
}
}
else {
for (i = 0; i < field.length; i++) {
if (field[i].name == "to_del[]"){
field[i].checked = false;
}
}
}
}
</script>Ce code est à placer avant la balise </head>.
La table mysql :
CREATE TABLE `tablenom` (
`id` int(11) NOT NULL auto_increment,
`Titre` varchar(255) NOT NULL default '',
`Date_ajout` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;Voilà.
Bàv,
Burnside.













Ziki
Dailymotion
Flickr
Technorati
Twitter
1. Le jeudi 25 septembre 2008, 19:11 par UNIT
Billet utile mais encore plus utile si vous utilisiez Jquery et ces formidables sélecteurs puis un petit appel ajax du script php pour pas rafraichir la page
2. Le jeudi 25 septembre 2008, 23:18 par Palleas
Pour la requète moi j'aurais utilisé un IN je pense :
WHERE id IN(id1,id2,id3)...
et surtout j'aurai FILTRE mes données! Si je change le value de tes checkbox, j'peux exploser ta base.
Et puis un refresh en META, ça ne se fait plus depuis les années 30 (plus ou moins), tout comme les mysql_* maintenant qu'on a de l'objet et des classes tiptop...
3. Le vendredi 26 septembre 2008, 12:42 par Kaimite
Salut,
Je suis d'accord avec Palleas pour la requête. Dans ton exemple il y a une requête par suppression.
En faisant :
<?php
$listeToDelete = implode(",", $_POST['to_del']);
$reqDel = mysql_query("DELETE FROM `matable` WHERE `uid` IN (" . $listeToDelete . ")");
header("Location:index.php");
?>
Sinon pour jQuery je ne sais pas j'utilise Prototype
Et puis le faire via Ajax revient à faire une requete + un appel ajax par suppression...
Sinon une chose importante je pense. Bien demande à l'utilisateur de confirmer 4 fois avant de supprimer 250 enregistrements d'un coup
@++ Kaimite
4. Le samedi 27 septembre 2008, 12:46 par UNIT
L'appel ajax aurait bien entenu était fais qu'une fois en regroupant les id a supprimer...
Pas faire 250 appels ajax quand même ^^
5. Le mardi 30 septembre 2008, 14:19 par Hugo
Hello,
A mon tour de commenter. Il y'a pas mal de choses qui peuvent être améliorer :
1/ La connexion à la base de données devrait être vérifiée. Il est inutile de continuer plus loin si l'on n'arrive pas à atteindre la BDD
2/ Utiliser PDO plutôt que les fonctions obsolètes mysql_*() serait 10 000 fois mieux.
3/ On évite de faire un SELECT * mais on préfère plutôt lister les champs dont on a besoin.
4/ Le calcul du modulo pour l'alternance des couleurs aurait plutôt sa place dans une petite fonction utilisateur qui renvoie la classe CSS appropriée en fonction de la valeur du compteur passé en paramètre.
5/ On ne redirige jamais avec un meta ni un javascript. C'est crade et peu sûr. On préfère la redirection côté serveur avec PHP et header().
6/ Pour la gestion du formulaire, on filtre les données que l'on reçoit. Cela donnerait simplement la chose suivante :
if(!empty($_POST['to_del'])) {
$cleans = array_unique(array_map('intval', $_POST['to_del']));
}
7/ On ne boucle pas sur N enregistrements à supprimer un par un mais on utilise la clause IN de MySQL beaucoup plus performante dans ce cas là.
8/ Avant de lancer la suppression, on s'assure aussi que l'on a bien des objets à supprimer car sinon on risque une suppression de tous les éléments de la table. En reprenant le code précédent que j'ai évoqué :
if(sizeof($cleans)>0) {
$query = sprintf('DELETE FROM table WHERE id IN(%s) LIMIT %d', implode(',',$cleans), sizeof($cleans));
mysql_query($query);
header('Location: http://www.site.com/page2.php');
exit;
}
8/ +1 pour l'utilisation de JQuery ou Mootools pour manipuler facilement le DOM.
++
Hugo.
6. Le jeudi 29 janvier 2009, 12:14 par suna
j sais pas pourquoi ça marche pas et m donne des erreurs au niveau du 'Delete'???!!
7. Le mardi 1 septembre 2009, 15:53 par symtech
Slt très cool ton script
merci pour tous