Aller au contenu

Change
Photo

PHP - MySQL - Suppression de données d'une table, depuis un listing


  • Veuillez vous connecter pour répondre
15 réponses à ce sujet

#1
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Bonjour à tous ! :slt:

Je dispose d'un tableau relié à une base de données, et je insérer une colonne au début, avec des cases à cocher qui me permettent de supprimer une ou plusieurs lignes au choix.

Image IPB

Chaque entrée est assignée automatiquement à une ID dans la base de données.
Ma table s'appelle "bulletin".

Je pense que ça devrait donner un truc dans le genre : DELETE FROM `base_donnees`.`bulletin` WHERE `bulletin`.`ID` = X; ( ou X est le nombre de l'ID bien entendu )

S'il y a moyen de faire une case "Modifier" pour modifier sur place, ou dans le fichier d'ajout en récupérant les données de la BD, je suis preneur. ( Un peu comme depuis PHPMyadmin en fait ). :)

EDIT : Les balises [IMG] de ce topic ne semblent pas fonctionner correctement chez moi ...

Voilà,
C'était ton hébergeur, je t'ai arrangé ça :D (pour l'image, pas pour ton problème :P )

Merci Oma :pray:

Modifié par Fitfit, 24 mai 2012 - 17:19.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#2
anonyme1

anonyme1

    NoLife P4G

  • Banni
  • 21 025 messages
Voilà,
C'était ton hébergeur, je t'ai arrangé ça :D (pour l'image, pas pour ton problème :P )
  • 0

#3
Yo Eight

Yo Eight

    Admin du Code

  • Membre
  • 4 218 messages
  • Localisationdans les environs de Paris
Ne serait-ce pas mieux de faire une requête qui peut supprimer une ou plusieurs données à la fois du genre:

delete from bulletin where id in (/*tous les ids à supprimer*/)
car en faisant des suppressions unitaires tu auras des performances pourris. De plus tu ne pourras pas faire de rollback complet si une de tes suppressions foire et tu finiras avec une base corrompue. A part si tu gères manuellement ta transaction
  • 0
Mon blog: Deikonad - Functional Programming
iMac 27" : Core i7 860 @ 2,8 GHz - ATI 4850M - 8Go @ 1066MHz - 1To @ 7200trs/min
MacBook Pro 15" : Core i7 2635QM @ 2GHz - ATI 6490M - 8Go @ 1333MHz - 500Go @ 5400trs/min
MacBook Pro 13" : Core 2 Duo P8400 @ 2,26GHz - nVidia 9400M - 2Go @ 800MHz - 160Go @ 5400trs/min

#4
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
J'ai résolu ça ce matin, avec la méthode que tu as citée. ;)

J'ai fait un formulaire avec un bouton supprimer avec un if(!isset
La case pour la checkbox :
echo '<td><input type="checkbox" name="CHOIX[]" value="' .$ligne[0]. '"></td>'."\n";

et un bout de code qui résume bien :

if (isset($_POST['CHOIX'])) $choix = $_POST['CHOIX']; else $choix="";
    
    include('connexion.php');
    
    if($choix)
    {
        for($i=0;$i<count($choix);$i++)
        {
            $sql = "DELETE FROM bulletin WHERE ID = '$choix[$i]'";
            if($res = mysql_query($sql))
            {
                echo "Elèves numéro $choix[$i] supprimé";
            }
            else echo mysql_error();
        }
    }
Pour le système qui permet de modifier, ce n'est pas obligatoire, c'est juste un petit défi ! Mais j'avoue que ça me tenterait bien :D

Modifié par Fitfit, 24 mai 2012 - 17:18.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#5
Patou

Patou

    Grand Geek

  • Membre
  • 823 messages
  • Localisation67
Cette méthode fonctionne bien sur, mais tu vas demander a la BDD de supprimer une entrée après l'autre...

Sinon pour la modification, tu rajoutes une colonne a ton tableau, avec un lien vers une autre page, par exemple:
<a href=Modif.php?Id=108477>Modifier</a>
Ou bien sur l'Id sera propre à chaque ligne:
<a href=Modif.php?Id=<?php echo($iUserId); ?>>Modifier</a>
Evidemment tu peux aussi mettre une image, etc... pour créer un joli bouton :P

Et dans cette page tu recuperes toutes les infos de la BDD, tu les affiches dans un formulaire, et l'utilisateur les modifies à son gré.

Modifié par Patou, 24 mai 2012 - 22:37.

  • 0

Desktop - i7-4790k / GTX 970 / 16Go / 2x256Go SSD + 2To HDD / 24" 1920x1080 Led

Laptop - Asus Transformer Book T300LA-C4004H

Anciens - Alienware M14X r2 / Alienware M11X r2 / Clevo M571RU-U

 

Alien FX géré par les capteurs de votre pc: AlienFx Plus


#6
Yo Eight

Yo Eight

    Admin du Code

  • Membre
  • 4 218 messages
  • Localisationdans les environs de Paris
@Fitfit

Fais gaffe tu peux te prendre des attaques d'injection SQL. Il ne faut pas construire de requetes avec des concatenations de chaines de charactères. Il me semble qu'il y a une fonction en PHP qui permet de sécuriser la construction de la requete SQL
  • 0
Mon blog: Deikonad - Functional Programming
iMac 27" : Core i7 860 @ 2,8 GHz - ATI 4850M - 8Go @ 1066MHz - 1To @ 7200trs/min
MacBook Pro 15" : Core i7 2635QM @ 2GHz - ATI 6490M - 8Go @ 1333MHz - 500Go @ 5400trs/min
MacBook Pro 13" : Core 2 Duo P8400 @ 2,26GHz - nVidia 9400M - 2Go @ 800MHz - 160Go @ 5400trs/min

#7
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><

Cette méthode fonctionne bien sur, mais tu vas demander a la BDD de supprimer une entrée après l'autre...

Non, je peux supprimer toutes les entrées que je sélectionne simultanément.

Sinon pour la modification, tu rajoutes une colonne a ton tableau, avec un lien vers une autre page, par exemple:

<a href=Modif.php?Id=108477>Modifier</a>
Ou bien sur l'Id sera propre à chaque ligne:
<a href=Modif.php?Id=<?php echo($iUserId); ?>>Modifier</a>
Evidemment tu peux aussi mettre une image, etc... pour créer un joli bouton :P

Et dans cette page tu recuperes toutes les infos de la BDD, tu les affiches dans un formulaire, et l'utilisateur les modifies à son gré.

A quoi sert
?Id=<?php echo($iUserId); ?>
Ça reprend l'ID de la ligne dans mon tableau, qui correspond à ma table ?

Fais gaffe tu peux te prendre des attaques d'injection SQL. Il ne faut pas construire de requetes avec des concatenations de chaines de charactères. Il me semble qu'il y a une fonction en PHP qui permet de sécuriser la construction de la requete SQL

J'ai un peu de mal à voir a quel niveau ça peut arriver sur mon code.
J'ai trouvé ceci http://fr.wikipedia....i/Injection_SQL et ceci http://fr2.php.net/m...cape-string.php
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#8
anonyme1

anonyme1

    NoLife P4G

  • Banni
  • 21 025 messages

Voilà,
C'était ton hébergeur, je t'ai arrangé ça :D (pour l'image, pas pour ton problème :P )

Merci omadessalla :P :jesors:
  • 0

#9
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><

EDIT : Les balises [IMG] de ce topic ne semblent pas fonctionner correctement chez moi ...

Voilà,
C'était ton hébergeur, je t'ai arrangé ça :D (pour l'image, pas pour ton problème :P )

Merci Oma :pray:

( le 24 ) :chant:

C'est de ma faute, j'aurais du répondre après ton post :happy:

Modifié par Fitfit, 26 mai 2012 - 15:51.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#10
anonyme1

anonyme1

    NoLife P4G

  • Banni
  • 21 025 messages
:D

Non, c'est ma faute, je n'avais qu'à ouvrir grand les yeux :bigeyes:

Je suis l'arroseur arrosé :P donc :jesors:
  • 0

#11
Yo Eight

Yo Eight

    Admin du Code

  • Membre
  • 4 218 messages
  • Localisationdans les environs de Paris

J'ai un peu de mal à voir a quel niveau ça peut arriver sur mon code.
J'ai trouvé ceci http://fr.wikipedia....i/Injection_SQL et ceci http://fr2.php.net/m...cape-string.php

Très simple, en reprenant ton exemple:

"DELETE FROM bulletin WHERE ID = '$choix[$i]'";
Imagine que $choix[$i] vaut

'toto' or 1 = 1
Ta requête devient:

DELETE FROM bulletin WHERE ID = 'toto' or 1 = 1
Ce qui a pour conséquence de supprimer tout le contenu de la table bulletin
  • 0
Mon blog: Deikonad - Functional Programming
iMac 27" : Core i7 860 @ 2,8 GHz - ATI 4850M - 8Go @ 1066MHz - 1To @ 7200trs/min
MacBook Pro 15" : Core i7 2635QM @ 2GHz - ATI 6490M - 8Go @ 1333MHz - 500Go @ 5400trs/min
MacBook Pro 13" : Core 2 Duo P8400 @ 2,26GHz - nVidia 9400M - 2Go @ 800MHz - 160Go @ 5400trs/min

#12
Patou

Patou

    Grand Geek

  • Membre
  • 823 messages
  • Localisation67

Ça reprend l'ID de la ligne dans mon tableau, qui correspond à ma table ?

Tout a fait, et ca passe l'ID en parametre dans l'URL (sur la page affichée dans le navigateur)
  • 0

Desktop - i7-4790k / GTX 970 / 16Go / 2x256Go SSD + 2To HDD / 24" 1920x1080 Led

Laptop - Asus Transformer Book T300LA-C4004H

Anciens - Alienware M14X r2 / Alienware M11X r2 / Clevo M571RU-U

 

Alien FX géré par les capteurs de votre pc: AlienFx Plus


#13
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Merci à tous pour vos conseils, j'ai réussi à faire ce que je voulais ! :pray:
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#14
Gorgoth

Gorgoth

    Grand Geek

  • Membre
  • 833 messages
  • LocalisationLyon
Tu as aussi corrigé le problème de ta construction de ta requète SQL Fitfit? Yo eight le souligne à juste titre, et il y a plusieurs moyens en PHP de régler le problème :

- vu que tu utilises MySQL tu dois avoir l'extension MySQLi de chargée, et dans ce cas tu peux utiliser la méthode suivante pour échapper tout caractère spécial dans ta commande SQL.
- si tu sais faire un peu d'objet et que tu commences à regarder du côté de PDO (Php Data Object) tu peux regarder de ce côté ci pour régler ton problème :).

Sur l'exemple que donne Yo Eight tu peux te retrouver avec une table vidée, voir carrément une base supprimée si l'utilisateur MySQL qui effectue ta requête a les droits de création / suppression de base, ou même pire car insidieux : un utilisateur créé par une injection SQL qui permettrait a une tierce personne de s'introduire dans ta base, avec tous les droits, sans que toi même ne t'en rende compte, si l'utilisateur qui exécute la requête a les droits de créer des utilisateurs. C'est d'ailleurs pour ça que l'on utilise en général un utilisateur dédié a une base, sans droits de création / suppression de base ou d'utilisateur. Ca limite déjà les risques x).
  • 0

03641894fffb3a5326d295712a78759be29d552d


#15
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Merci !
Oui je vois bien ou vous voulez en venir. Dans mon cas ce n'était pas très utile, vu que c'est juste un exercice personnel, mais c'est bon à savoir pour une utilisation plus vaste ;)
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#16
Jahz

Jahz

    Space cowboy

  • Membre
  • 3 616 messages
C'est aussi bon a mettre en place pour comprendre comment ca marche et le ressortir plus facilement en temps voulu :happy:
  • 0

Macbook Pro 15" - i7 2,2 GHz - Radeon HD 6750M - 2x4Gb DDR3
RIG - i7 3770k 3.5GHz - MSI GTX1070 Gaming X - 2x4Gb DDR3





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)