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

PHP & Base de données Discussion :

Faire des delete MySQL avec une jointure [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 15
    Points
    15
    Par défaut Faire des delete MySQL avec une jointure
    Bonjour,

    La question pourrait paraître idiote aux développeurs confirmés, mais étant autodidacte débutant, je préfère tout de même poser la question.

    => Est-il possible de supprimer une ligne d'une table, et d'une seule table, en faisant une jointure avec une seconde table dans la requête MySQL ?

    Prenons un exemple simplifié pour que ce soit plus parlant.

    1/ Disons que j'ai une table "annonces" à 3 champs : id, texte, categorie

    2/ J'ai un seconde table "categories" à 2 champs : id, id_responsable

    3/ J'aimerais créer un formulaire en ligne permettant au responsable d'une catégorie de supprimer une annonce.

    4/ Par prudence, j'aimerais m'assurer au niveau de la requête MySQL qu'un responsable ne peut supprimer que des annonces classées dans une catégorie qu'il gère.

    5/ Ne vais-je pas créer de problèmes en utilisant une requête qui ressemblerait à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = "
    DELETE FROM annonces a
    left join categories c on a.categorie = c.id
    where a.id = '".(int)$_REQUEST["id_annonce"]."' and c.id_responsable = '$id_responsable_extrait_de_la_session'
    limit 1;";

    Merci par avance pour votre aide

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Voyageur Du Net Voir le message
    Est-il possible de supprimer une ligne d'une table, et d'une seule table, en faisant une jointure avec une seconde table dans la requête MySQL ?
    Possible. Faut juste faire attention à la syntaxe.
    Tout est expliqué dans la doc : http://dev.mysql.com/doc/refman/5.1/en/delete.html ;-)
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Merci pour le lien.

    J'y ai jeté un oeil, mais je ne suis pas sûr d'y avoir trouvé le réponse exacte à ma question.

    Quelqu'un pourrait me confirmer que ma syntaxe est correcte ?

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    3/ J'aimerais créer un formulaire en ligne permettant au responsable d'une catégorie de supprimer une annonce.
    Par rapport à ce que tu dis, théoriquement non.
    Mais quand même, le plus simple c'est d'essayer non ? Et là, tu aurais vu ce que ça y faisait.

    Si c'est pour supprimer uniquement dans la table "annonce", (donc pas "categorie"), il faudrait le déclarer explicitement, ceci entre le DELETE et le FROM.
    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE annonce
    FROM annonces a
    LEFT JOIN categories c on a.categorie = c.id
    WHERE ... etc ...
    Dans la Doc, les schéma est le suivant :
    DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...]
    FROM table-references
    [WHERE where_definition]
    Sinon, j'aurais plus utiliser un JOIN (ou INNER JOIN) au lieu de LEFT JOIN.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Merci pour cette réponse,

    Pour le test, je ne dispose pas vraiment d'un environnement de travail me permettant de faire des tests sans risques. En gros, je vais devoir faire mes tests directement sur les données en production...

    Raison pour laquelle je préfère prendre des conseils avant.

    Qu'entends-tu par "Par rapport à ce que tu dis, théoriquement non."

    A qui ou quoi s'adresse ce "non" ?

    Encore une question idiote... ça changerait quoi de remplacer left join par join ?

    Je précise que le développement n'est pas mon métier de base... Dès que j'en aurai les moyens, je déléguerai TOUS les développements à de vrais professionnels.

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Qu'entends-tu par "Par rapport à ce que tu dis, théoriquement non."
    Les explications ont été donné après.
    Donc "Non" dans le sens où la suppression ne devrait pas concerner uniquement la table "annonce" mais aussi "categorie" dans ton code dû à leur jointure.
    Si la suppression doit se faire sur 1 seule des 2 tables, alors faut le définir explicitement dans la requête, soit entre le DELETE et le FROM.
    (les même explications qui suivant le "non").

    ça changerait quoi de remplacer left join par join ?
    Le JOIN est plus restrictif qu'un LEFT JOIN, donc on peu obtenir plus de lignes que prévu avec un left join, ça peu être piégeant.
    Faut faire des essai.

    Je précise que le développement n'est pas mon métier de base...
    Ca n'est pas le mien non plus, mais alors pas du tout.

    Pour le test, je ne dispose pas vraiment d'un environnement de travail me permettant de faire des tests sans risques. En gros, je vais devoir faire mes tests directement sur les données en production...
    Chacun sa méthode, chacun fait comme il veut, on sera d'accord.

    Mais à mon sens, le minimum syndical serait d'éviter de faire des modifs directement sur le site en production, je dirais même, surtout pas.

    Il existe plusieurs façons d'éviter ce genre de problème, j'en donne que 2 :

    1/ Il existe des Soft comme WampServer (que j'utilise), EasyPhp, Xampp, Mamp, et bien d'autres ... (tout systèmes/OS), qui s'installe en général très facilement. (reste néanmoins à faire quelques manip coté config).
    On obtient un environnement très proche de celui de son hébergeur (on fera en sorte de choisir celui le plus proche).
    Cet environnement comprend tout l'essentiel (Apache, MySQL, Php, d'où leur noms, AMP)
    Au bout, ceci permet de développer son projet en local, et même d'en créer autant qu'on veut pour faire toutes sortes d'essai, ce qui permet en parallèle d'apprendre aussi.
    Même chose pour la Bdd, on pourra en créer autant qu'on veut, donc faire des tonnes d'essais.
    Suffit de récupérer les fichiers et une sauvegarde de la Bdd pour obtenir quelque chose de très proche du site en production.
    (tout ceci demande un minimum d'apprentissage, mais les bouquins, tutos, faq, forums, etc ... sont extrêmement nombreux).

    2/ Une autre technique (voir même les 2) consiste à créer un sous-domaine dans son espace d'hébergement, et créer une 2ème Bdd, on duplique alors le tout, et on obtient alors une version "alpha" ou "beta" pour faire les vérifs nécessaires.

    Comme dit précédemment, il y a encore d'autres solutions.


    Raison pour laquelle je préfère prendre des conseils avant.
    Si on suit ta logique, alors il faudrait aussi l'appliquer pour tous les autres langages : Php, Javascript, voir même le HTML, donc de demander conseil sur un forum si tel ou tel code ne va pas mettre en vrac le site.
    C'est pas possible un truc pareil ...
    Tu vas bombarder les forums, en épuiser quelques uns avant l'heure.
    Puis le jours ou ça va coincer un peu plus, un peu plus longtemps, tu vas avoir une attaque avant l'heure

    Ca me parais franchement pas jouable. Tout juste le site de sa grand même.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Merci pour les explications du début.

    Pour le reste, on est un peu hors sujet, mais je vais tâcher d'apporter qq réponses, sans trop m'étendre...

    - J'utilise EasyPHP.

    - Le site en production comprend du code fait maison, du code de scripts open source, et du code réalisé par des tiers => J'ai bien une version locale du site sur mon poste... Mais celle-ci n'est pas complètement fonctionnelle, et ça pose pbm pour le projet en cours.

    - Le site de "grand mère" en question, c'est http://www.voyage-net.com/
    Clairement, y a plus joli, y a mieux codé, bref, y a mieux. Mais bon, pour un site lancé à la base par un autodidacte avec peu de moyens, il s'en sort déjà pas mal...

    ...Sur ce, bonne soirée !

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    - J'utilise EasyPHP.
    tu disais que tu ne pouvais pas faire d'essai sans risque, et bien finalement non.
    Tu as EasyPhp, tu peux faire tous les essai que tu veux, sans l'ombre d'un risque.
    En tout cas, pour ce qui était de la syntaxe de cette requête DELETE.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. delete avec une jointure mysql
    Par LampeRouge dans le forum Requêtes
    Réponses: 7
    Dernier message: 03/04/2012, 19h21
  2. Faire des requêtes préparées avec l'extension mysql
    Par stealth35 dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 3
    Dernier message: 03/03/2011, 02h15
  3. Delete avec une jointure
    Par mazizou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/07/2007, 13h24
  4. [MySQL] probléme de repetition avec une jointure
    Par kenzo83220 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/11/2006, 17h24
  5. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42

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