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 en php5


Sujet :

Langage PHP

  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 30
    Par défaut suppression en php5
    salut,
    j'ai une problème à la fonction supprimer puisqu'il permet de me supprimer toutes les enregistrements dés que je veux supprimer un seul enregistrement lorsque je fais entre le clé primaire(id_circuit) voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function supprimercircuit($id_circuit){
    $y = $_POST['id_circuit'];
    $requete ="DELETE from circuit where id_circuit LIKE '%".$y."%';";
    if($result = @mysql_query($requete)) {  
    echo "";
    }
    }
    et je fais l'appel de la fonction de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form method="post" action="circuitsupprimer.php">
    				<font color="white">id_circuit:</font>
    				<input name="id_circuit" type="text" value ="<?php include('recherchedecircuit.php'); $obj=new circuit('.$id_circuit.','.$Nomcircuit.','.$Villededépart.','.$Jourdedépart.','.$Jourderetour.','.$Durée.','.$Prix.','.$Supplementsingle.','.$Reductionenfant.','.$Description.'); $obj->supprimercircuit('.$id_circuit.'); ?>"><br></center>
    				<td>
    				<button name="supprimer" value=supprimer type=submit"><img src="bouttondelete.jpg" width="100" height="100"></button></form>
    comme je dis il me permet de supprimer tous les enregistrements et il m'affiche la faute suivante:
    <br /> <b>Notice</b>: Undefined index: id_circuit in <b>D:\EasyPHP-5.3.3\www\pfe\recherchedecircuit.php</b> on line <b>307</b><br />
    et merci d'avance

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function supprimercircuit($id_circuit){
          $y = $_POST['id_circuit'];
    A quoi vous sert $id_circuit si vous utilisez "$y" dans votre requête (soit directement la variable en POST, super faille de sécurité)

    Par ailleurs, il faut éviter les variables avec accent.

    Enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input name="id_circuit" type="text" value ="<?php include('recherchedecircuit.php'); $obj=new circuit('.$id_circuit.','.$Nomcircuit.','.$Villededépart.','.$Jourdedépart.','.$Jourderetour.','.$Durée.','.$Prix.','.$Supplementsingle.','.$Reductionenfant.','.$Description.'); $obj->supprimercircuit('.$id_circuit.'); ?>">
    Vous mettez un méthode de suppression directement dans la valeur du formulaire? J'ai l'impression que les bases du PHP ne sont pas maitrisées du tout...

    http://sylvie-vauthier.developpez.co...rand-debutant/
    Regardez surtout :
    • variables
    • Toute l'étape 3 (formulaire)

  3. #3
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 30
    Par défaut
    merci a vous c'est bien passé voici le code si quelqu'un veut l'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function supprimercircuit($id_circuit){
    if(isset($_POST['supprimer']))
    {
     $requete ="DELETE from circuit where id_circuit LIKE '%".$_POST['id_circuit']."%';";
        if($result = @mysql_query($requete)) 
    {  
    					echo "";
    }
    }
    echo "<font color='white'>id_circuit:</font>
    	<input name='id_circuit' type='text' >";

  4. #4
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    Si je peux me permettre d’améliorer le code:

    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
     
    public function supprimercircuit($id_circuit)
    {
        $requete ="DELETE from circuit where id_circuit LIKE '%".(int)$id_circuit."%';";
        $result = @mysql_query($requete);
     
        return $result===false ? 'erreur' : true;
    }
     
     
    if(isset($_POST['supprimer']) && isset($_POST['id_circuit']))
    {
        $ret = supprimercircuit($_POST['id_circuit']);
        echo 'Résultat = ' . $ret;
    }
    echo "<font color='white'>id_circuit:</font>
    	<input name='id_circuit' type='text' >";

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Citation Envoyé par FMaz Voir le message
    Si je peux me permettre d’améliorer le code
    Sans remettre en doute vos compétences et sauf votre respect, les améliorations sont minimes par rapport à tout ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = @mysql_query($requete));
    1 parenthèse en trop et le @ n'est, pour moi, pas une bonne pratique. (on cache les messages en prod et on les log, ou les affiche en dev mais on ne met pas de "@")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $result===false ? 'erreur' : true; + echo 'Résultat = ' . $ret;
    Donc si la requête fonctionne bien, on affiche "Résultat = " ?

    Le fait de retourner une valeur est bien mais à part ça, pas d'amélioration pour moi

  6. #6
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    J'ai édité pour la ) en trop, merci.
    le @ était dans le code original, je l'ai préservé. Le projet peut le justifier et je ne suis pas en mesure de juger de sa pertinence.

    Le plus important dans mon correctif est le fait que toutes les requêtes ayant été données jusqu'ici étaient injectables.

    L'autre détails était ce que tu mentionnais: rachouda utilise une fonction, mais n'utilise jamais le paramètre. J'ai donc proposé une fonction mieux découplée.


    Finalement, si la requête s'exécute bien, je n'ai aucune idée de ce que rachouda voudra affichée. C'est à elle de s'occuper de l'implémentation. Pour répondre à ta question, si la requête réussit, ça affichera 1.

    Exemple d'implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if($ret){
         echo '<div class="confirm_msg">' . _("Le circuit à été supprimé avec succès.") . '</div>';
    }
    else{
         echo '<div class="error_msg">' . _("Erreur lors de la suppression.") . '</div>';
    }
    On pourrait encore ajouter une meilleure gestion des erreurs en capturant les détails de l'erreur dans la fonction, et en retournant les résultats pour les afficher en complément au message d'erreur.

    Bref, on pourrait faire un tas de choses, mais les détails d'implémentation dépasse la question.

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Au temps pour moi, le @ était effectivement dans le code de base...Mon message s'adresse donc à l'OP pour ce point

    Et j'ai du dérouler la page trop vite car je pensais que le (int) avait été mis par quelqu'un d'autre avant... C'est ça de faire plein de choses en même temps...

    Par contre, pourquoi ne pas faire "return $result" plutôt que votre condition ternaire qui est inutile si vous utilisez l'implémentation de votre dernier message (qui est celle que j'utiliserais, en plus, ça sent la bonne librairie de traduction ça )

    Après, on est d'accord pour l'implémentation des erreurs, j'essayais juste d'avertir l'OP par mes remarques envers votre post.

  8. #8
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    Et bien, ce code est loin d'être parfait, mais je crois qu'il n'est jamais trop tard pour commencer à améliorer le code pour avoir un découplage des responsabilités.

    On appel la fonction avec une tâche en tête: supprimer. On s'attend à ce qu'elle retourne que c'est bon, ou pas. L'implémentation ne devrait même pas avoir à se soucier du fait qu'il y ai une ressource. Si éventuellement la base de données étaient changée pour autre chose que MySQL, il sera plus simple de modifier quelques fonctions que l'ensemble des cas d'implémentation qui doivent traiter avec une ressource.

    Voilà pourquoi la fonction que je propose ne retourne pas une ressource.

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Sauf que, de mémoire (belle lurette que j'utilise plus mysql_*), mysql_query ne retourne pas obligatoirement une ressource.

    En y allant, je cite le manuel :

    Pour les autres types de requêtes, INSERT, UPDATE, DELETE, DROP, etc., mysql_query() retourne TRUE en cas de succès ou FALSE en cas d'erreur.
    Il ne retournera pas de ressource dans ce cas-ci.

  10. #10
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    Ah, et bien dans cas, oui, retourner $result pourrait être une option.
    ( Moi non plus je n'utilise plus mysql_ )

    Alors la méthode pourrait être:
    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
     
    /**
     * Effectue la suppression d'un circuit
     * 
     * @param int $id_circuit Id du circuit à supprimer
     * @return bool
     */
    public function supprimercircuit($id_circuit)
    {
        $requete ="DELETE from circuit where id_circuit = ".(int)$id_circuit.";";
        return @mysql_query($requete);
    }
     
     
    if(isset($_POST['supprimer']) && isset($_POST['id_circuit']))
    {
        $ret = supprimercircuit($_POST['id_circuit']);
        echo 'Résultat = ' . ($ret ? 'Ok' : 'Erreur');
    }
    echo "<font color='white'>id_circuit:</font>
    	<input name='id_circuit' type='text' >";
    Ceci dit, je présume ici que l'ID du circuit est un entier. Mais pourquoi un LIKE ? Peut-être que l'ID du circuit est alpha numérique:

    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
     
    /**
     * Effectue la suppression d'un circuit
     * 
     * @param string $id_circuit Id du circuit à supprimer
     * @return bool
     */
    public function supprimercircuit($id_circuit)
    {
        $requete ="DELETE from circuit where id_circuit LIKE '%". mysql_real_escape_string($id_circuit)."%';";
        return @mysql_query($requete);
    }
     
     
    if(isset($_POST['supprimer']) && isset($_POST['id_circuit']))
    {
        $ret = supprimercircuit($_POST['id_circuit']);
        echo 'Résultat = ' . ($ret ? 'Ok' : 'Erreur');
    }
    echo "<font color='white'>id_circuit:</font>
    	<input name='id_circuit' type='text' >";

  11. #11
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 30
    Par défaut
    bonjour,
    je vous remercie pour votre effort mais le code qui vous proposée ne fonctionne pas lorsque j'essaye de l'utiliser
    cordialement
    rachouda

  12. #12
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Ooooooh "ne fonctionne pas" et "ne marche pas" sont les réponses que je préfère.

Discussions similaires

  1. suppression d'un element grace a son id [xml] php5
    Par toomwayer dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/10/2007, 20h17
  2. [DOM] suppression d'un noeud fils xml en JAVA
    Par alexandre54 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 20/03/2003, 10h44
  3. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 18h56
  4. [CR] suppression du bas de page
    Par grosjej dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 10/09/2002, 09h58
  5. Réponses: 3
    Dernier message: 12/06/2002, 22h15

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