IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

suppression dans base de données


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut suppression dans base de données
    bonjour,

    J'ai placé les données de ma bdd dans un tableau, j'aimerai avoir une colonne avec un bouton supprimer, de sorte qu'en cliquant sur supprimer, l'enregistrement soit supprimé de ma base de données. Mais j'ai un soucis quelque part... . Selon moi, dans la page supprimer.php (soit le dernier code), la variable $nom n'est pas reconnue. Et je ne sais pas comment faire pour qu'elle soit reconnue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <!doctype html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
    
    <link rel="stylesheet" media="screen" type="text/css" title="non style" href="menu.css" /> 
      <script src="script.js"></script>
    
      	
      </head>
    
    <?php include('menu.php'); ?>
    
    
    <?php include ('entete.php');?>
    
     
    <div id="body">
    
    	
     <div id="content">
     
      <form  action="deconnexion.php"method="POST" >
                           
                                    <input type="submit" class="form-control" id="deco" name="deco" value="deconnexion">
                        
    	</form>
     
     
     
    
    
    <h2>Traitement</h2>
    <p>
    <br />
    <br/ >
    
    	
    <?php
    try
    {
    	// connexion à la base fonctions
    	$bdd = new PDO('mysql:host=localhost;dbname=fonction;charset=utf8', '***', '***');
    }
    catch(Exception $e)
    {
    	
            die('Erreur : '.$e->getMessage());
    }
    //$reponse = $bdd->query('SELECT * FROM patient');
    
    
    
     
    ?>
    
    <table border="2px">
     
      <tr>
        <th>nom :</th>
        <th>hospitalisé?</th>
        <th>date naissance :</th>
        <th>date sortie :</th>
      </tr>
     <?php while ($donnees = $reponse->fetch())
    {
    ?>
    
      <tr>
        <td align="left"><?php  echo $donnees['nom'];?>
    
    	</td>
    	<td><?php if  ($donnees['hospitalisation'] == "1") {echo '<p style="color:#FF0000;">oui</p>';} else {echo "non";} ; ?></td>
    	<td><?php echo $donnees['date_naissance']; ?></td>
    	<td><?php if  ($donnees['sorti'] == "1") {echo '<p style="color:#FF0000;">oui</p>';} else {echo "non";}; ?></td>
    	<td width="150">
    
    	 <a href="supprimer.php?nom=<?php echo $donnees['nom']?>">supprimer</a>
      
    
    
    </td>
      </tr>
     
    <?php
    }
    $reponse->closeCursor(); 
    ?>
     
    
    </table>
    </div>
    
    <?php include ('footer.php');?>
    
    </html>
    et la page supprimer.php après maintes essais... donne ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?php
     
    try
    {
     
    	$bdd = new PDO('mysql:host=localhost;dbname=fonction;charset=utf8', 'root', 'root');
    }
    catch(Exception $e)
    {
     
            die('Erreur : '.$e->getMessage());
    }
     
     
    	session_start();
    	//$nomPersonne = $donnees['nom'];
    //print_r $nom;
    	 if (!empty($donnees['nom'])) {
            $sql = $bdd->prepare("DELETE FROM patient WHERE nom = :nom");
            $sql->bindValue('nom', $_SESSION['nom']);
           if (! $sql->execute() ){
             echo 'erreur';
           }
    	 }
    	   ?>
    D'avance merci

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ton script supprimer.php est censé recevoir la valeur de l’enregistrement à supprimer en tant que paramètre GET, mais tu n’utilises pas $_GET. Sois bien conscient que tes deux scripts PHP ont des contextes d’exécution différents, et que par conséquent supprimer.php ne peut pas connaître la variable $donnees déclarée dans la page principale.

    Tu sembles en avoir pris conscience puisque tu tentes d’utiliser une variable de session, cependant aucun des deux scripts que tu as montré n’affecte quelque chose à la variable $_SESSION['nom'], donc cette variable est vide au moment où tu t’en sers.

    Je suggère ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (isset($_GET['nom'])) {
      $sql = $bdd->prepare("DELETE FROM patient WHERE nom = :nom");
      $sql->bindValue(':nom', $_GET['nom']);
      if (!$sql->execute()) {
        echo 'erreur';
      }
    }
    Cependant, il n’y aucune sécurité dans ce script en l’état actuel. N’importe qui peut supprimer des données au hasard dans la table en faisant des reqêtes GET à l’adresse supprimer.php et en utilisant la console pour faire varier le paramètre nom. Tu devrais au moins vérifier que l’action vient d’un utilisateur enregistré, et c’est là que les sessions vont s’avérer utiles.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Merci pour votre réponse. Je ne l'avais pas mis, mais pour arriver sur la page dont je vous ai mis le code, il faut impérativement passer par un formulaire de connexion, qui fonctionne.

    Cependant, il me semble qu'en suivant votre raisonnement, il serait assez simple de supprimer une personne dès lors que la personne a un compte.

    En conséquence, pourriez-vous me conseiller une méthode beaucoup plus sûre que celle-ci (et en oubliant pas que je suis novice en php)? J'aimerai qu'on ne puisse pas supprimer des personnes si facilement

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Je suppose que tu as une poignée d’utilisateurs privilégiés qui ont le droit de supprimer des personnes, et tes autres utilisateurs, la majorité, n’ont pas ce droit.

    Ce privilège doit faire partie du profil de l’utilisateur. En clair, dans ta table qui représente les utilisateurs, tu dois avoir une ou plusieurs colonne(s) qui représente(nt) les privilèges. Est-ce que tu as déjà quelque chose qui ressemble à ça ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Merci pour votre réponse.

    non, en fait je ne me suis pas encore occupé de la partie 'utilisateurs'. Si je suis votre raisonnement, je dois avoir dans la table utilisateur (au moins):

    -id
    -login
    -mot de passe
    -email
    -privilege (et là sans doute utiliser le boléen).

    Je ne vois cependant pas comment faire ensuite (au niveau de l'utilisation du champ privilège).

    En tout cas, l'authentification se fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    session_start();
    if (!isset($_SESSION['id'])) {
        header('Location: connexion.php');
        exit;
    } else {
        require('shared.php');
     
        $stmt = $bdd->prepare('SELECT * FROM utilisateurs WHERE id = :id');
        $stmt->bindParam('id', $_SESSION['id'], PDO::PARAM_INT);
        $stmt->execute();
        $user = $stmt->fetch();
     
        echo 'Bienvenue ', htmlspecialchars($user['login'], ENT_NOQUOTES);
    }
     
    			?>
    D'avance merci pour votre retour

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Il faut que tu exploites l’information $user['privilege'] que tu devrais en principe récupérer avec la requête du code que tu as montré. Mets une variable dans le tableau de session pour indiquer que l’utilisateur a le droit de suppression ou pas ; il faudra que tu testes cette variable dans ton script supprimer.php. En plus de ça tu peux choisir de ne pas afficher les boutons de suppression pour un utilisateur qui n’a pas le privilège, mais il pourra toujours faire les requêtes GET à la main s’il est malin, donc le test dans supprimer.php est indispensable.

    Pour creuser un peu le sujet : suivant les installations de serveur local, tu peux avoir accès à la base information_schema depuis ton PHPMyAdmin (moi j’y ai accès, je suis sous WampServer 2.5). On y trouve une table USER_PRIVILEGES qui liste les différents privilèges accordés aux utilisateurs. Il peut y avoir différents types de privilèges donc c’est un peu plus complexe que ce dont tu as besoin, mais ça peut te donner de l’inspiration.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1/ pour commencer, il faudrait que tu nous expliques clairement à QUI va servir ce code
    Citation Envoyé par bertrantitude Voir le message
    ...il faut impérativement passer par un formulaire de connexion...
    Tu parles de QUI ?
    • un administrateur du site (Panel d'administration, réservé au(x) seul(s) administrateur(s)) ?
    • un "membre" (ou "patient") ?


    Je pars du principe qu'il s'agit d'un administrateur (en effet, les membres ne sont pas censés lister les autres membres, encore moins avoir la possibilité de les supprimer !)
    Donc, à priori, il n'a pas spécialement intérêt à faire n'importe quoi sur "son" site

    2/ La requête de suppression
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    "DELETE FROM patient WHERE nom = :nom"
    J'attire ton attention sur le fait que, si PLUSIEURS "patients" ont le MEME "nom", ils seront TOUS supprimés !!
    Donc, ça craint.

    Dans la table, chaque "patient" est enregistré avec un id, auto-incrémenté, et donc UNIQUE.
    C'est cet id qu'il faut utiliser systématiquement, pour identifier LA ligne à supprimer (ou modifier,...)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    "DELETE FROM patient WHERE id = :id"

    3/ La connexion
    Au moment de la connexion (traitement du formulaire de connexion, on vérifie les parmètres,.....) :
    -> tu enregistres dans des variables de SESSION : l'id, le nom (ou pseudo), le privilège
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php session_start(); // (EN DEBUT DE CODE)
    // traitement du formulaire de connexion...
    // si paramètres OK : on enregistre certaines données en SESSION
      $_SESSION['user']['id'] = $user['id'];
      $_SESSION['user']['nom'] = $user['nom'];
      $_SESSION['user']['privilege'] = $user['privilege'];
    // S'il n'est pas encore connecté, ou erreur de paramètres, on vide :
      unset($_SESSION['user']);
    Attention : on ne met JAMAIS un mot de passe en SESSION !
    Ni AUCUNE DONNEE "SENSIBLE"...

    4/ Pour les pages "à protéger" (= accessibles uniquement si user connecté), on vérifie au début que $_SESSION['user']['id'] n'est pas vide.
    Exemple de code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php session_start(); // (EN DEBUT DE CODE)
    if( empty($_SESSION['user']['id']) || !is_numeric($_SESSION['user']['id']) )
    {
      header('location:formulaire-connexion.php'); // si pas connecté, on redirige vers le formulaire d'authentification
    }
    // sinon, on peut continuer (user connecté)
    5/ L'histoire des "privilèges"...
    $_SESSION['user']['privilege'] peut servir ensuite, si :
    • tu as plusieurs administrateurs
    • et qu'ils n'ont pas tous le droit de tout faire (ex. : gérer les articles, gérer les membres,...)

  8. #8
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Je prends acte de votre remarque par rapport au nom du patient.

    Pourriez-vous me dire quelle est mon erreur?

    Dans la page où il y a le bouton supprimer, j'ai placé (en ligne 14 du code ci dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php while ($donnees = $reponse->fetch())
    {
    ?>
     
      <tr>
        <td align="left"><?php  echo $donnees['nom'];?>
     
    	</td>
    	<td><?php if  ($donnees['hospitalisation'] == "1") {echo '<p style="color:#FF0000;">oui</p>';} else {echo "non";} ; ?></td>
    	<td><?php echo $donnees['date_naissance']; ?></td>
    	<td><?php if  ($donnees['sorti'] == "1") {echo '<p style="color:#FF0000;">oui</p>';} else {echo "non";}; ?></td>
    	<td width="150">
     
    	 <a href="supprimer.php?id_du_patient=<?php echo $donnees['id_du_patient'];?>">supprimer</a>
     
     
     
    </td>
      </tr>
     
    <?php
    }
    $reponse->closeCursor(); 
    ?>
    L'url est http://127.0.0.1/projects/Nouveau%20...u_patient=3816 . Ceci me parait juste... .

    Sur la page supprimer.php, j'ai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?php
     
    try
    {
     
    	$bdd = new PDO('mysql:host=localhost;dbname=fonction;charset=utf8', 'root', '***');
    }
    catch(Exception $e)
    {
     
            die('Erreur : '.$e->getMessage());
    }
     
     
     
    	if (isset($_GET['id_du_patient'])) {
     
        $sql = $bdd->prepare("DELETE FROM patient WHERE id_du_patient = :id_du_patient");
      $sql->bindValue(':id_du_patient', $_GET['id_du_patient']);
     
      if (!$sql->execute()) {
        echo 'erreur';
      }
    }
    	   ?>
    et j'ai droit au message "erreur"

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,


    Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $sql->bindValue(':id_du_patient', $_GET['id_du_patient']);
    • bindValue : Associe une valeur à un paramètre


    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $sql->bindParam(':id_du_patient', $_GET['id_du_patient'], PDO::PARAM_INT);
    • bindParam : Lie un paramètre à un nom de variable spécifique
    • PDO::PARAM_INT permet de verifier que le paramètre est bien un ENTIER

  10. #10
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    j'ai droit à "erreur" :S

    pourtant j'ai bien en url "http://127.0.0.1/projects/Nouveau%20dossier/supprimer.php?id_du_patient=3816"


    EDIT: en fait le soucis vient du fait que c'était ma clé primaire et qu'il y avait une liaison avec une autre table

  11. #11
    Invité
    Invité(e)
    Par défaut
    Alors il faut attraper l'erreur SQL :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if (isset($_GET['id_du_patient'])) 
    {
    	$sql = $bdd->prepare("DELETE FROM patient WHERE id_du_patient = :id_du_patient");
    	try
    	{
    		$sql->bindParam(':id_du_patient', $_GET['id_du_patient'], PDO::PARAM_INT);
    		$succes = $sql->execute();
    	catch(Exception $e)
    	{
    		die('Erreur : '.$e->getMessage());
    	}
     
    	if ( !$succes ) {
    		echo 'erreur';
    	}
    }
    Ca dit quoi ?

    [EDIT] Tu es sûr que le champ en BdD s'appelle "id_du_patient" ?
    Ce n'est pas simplement "id" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$sql = $bdd->prepare("DELETE FROM patient WHERE id = :id_du_patient");

  12. #12
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Désolé, je viens de voir que le soucis vient de la structure de mes tables. En fait id_du_patient est ma clé primaire et est envoyé dans la table "medicaments", raison pour laquelle ça bloque (j'ai essayé de supprimer une personne qui ne prend pas de médicaments et donc qui n'est pas "envoyée" dans la table patient et ça a fonctionné... et dire que je me suis arraché les cheveux pour rien )

    Nom : Capture.PNG
Affichages : 1466
Taille : 17,6 Ko

    Ce serait mieux que je fasse une requete qui supprime tous les médicaments qu'il prend ou que je revoie la structure?

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/09/2009, 15h26
  2. Réponses: 9
    Dernier message: 13/10/2005, 18h24
  3. [VB.NET]Champ image dans base de donnée access
    Par dankes dans le forum Windows Forms
    Réponses: 10
    Dernier message: 06/10/2005, 15h31
  4. [VB.NET] filtre dans base de donnée
    Par speedtug dans le forum Windows Forms
    Réponses: 7
    Dernier message: 21/09/2005, 17h12
  5. Réponses: 8
    Dernier message: 11/05/2005, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo