DELETE FROM table WHERE ....

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • DELETE FROM table WHERE ....

    Hallo,
    ich hab hier ein kniffliges Problem, dass ich versuche darzustellen

    ich baue eine Menuestruktur folgendermaßen auf:

    eine id steht für die Seite meines cms systems
    eine menue_id steht für die untergeordneten menues


    also:

    1. Ebene: #####id = 1
    2. Ebene: menue_id = 1, id = 2 | menue_id = 1 id = 3
    3. Ebene: ################### menue_id = 3, id = 4 etc.

    nun möchte ich, dass, wenn ich das menue mit der id = 1 lösche auch alle untergeordneten Menues gelöscht werden.

    Mit zwei ebenen ist das leicht und geht so:

    PHP-Code:
    $sql "DELETE FROM
                       menue
                    WHERE
                       id = '"
    .$_GET['id2delete']."' OR
                       menue_id = '"
    .$_GET['id2delete']."';";
      
    mysql_query($sql) OR die (mysql_error()); 
    bei drei ebenen ist das schwieriger. Ich habe folgendes versucht:

    PHP-Code:
     $sql "DELETE FROM
                       menue
                    WHERE
                       id = '"
    .$_GET['id2delete']."' OR
                       id IN (SELECT menue_id FROM menue);"
    ;
      
    mysql_query($sql) OR die (mysql_error()); 
    Hier gibt es, für viele von euch logisch, diese Fehlermeldung:

    You can't specify target table 'menue' for update in FROM clause

    Vielleicht gibt es da eine ähnlich Lösung, nach der ich euch gerne fragen möchte. Ich hoffe das Problem ist hinreichend beschrieben worden

  • #2
    Das ist eine ungünstige Datenstruktur. Schau dir lieber mal Nested Sets an.

    Außerdem hast du das sehr wichtige Escaping der Werte vergessen. Siehe:

    PHP: mysql_real_escape_string - Manual
    PHP: SQL Injection - Manual

    Kommentar


    • #3
      die menuestruktur hat sich sehr bewährt

      aus in dem vorliegenden Problem, ich vertehe auch nicht was bei sested sets anders ist

      Kommentar


      • #4
        Hallo,

        ich kann dir Nested Sets wärmstens empfehlen, um hierarchische Strukturen in einer DB abzulegen. Da kannst du beliebig tief schachteln, ohne mit Eltern-IDs arbeiten zu müssen und du kannst ganze Teilbäume abrufen/löschen/verschieben/vertauschen.

        Gruß,

        Amica
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Wenn dir die Nested Sets absolut nicht gefällt, bleibt dir nichts anderes als eine Rekursion. Selbst wenn du die 3. Ebene jetzt löschen kannst, bekommst du spätestens probleme bei der 4. Ebene, usw...

          Kommentar


          • #6
            Vielleicht erleichtert dir das Studium des relevanten PEAR Packages (s. Manual :: DB_NestedSet ) die Entscheidung, dich doch noch mit den Nested Sets zu befassen.

            GZ,

            Ron

            Kommentar


            • #7
              Zitat von TobiaZ Beitrag anzeigen
              Wenn dir die Nested Sets absolut nicht gefällt, bleibt dir nichts anderes als eine Rekursion. Selbst wenn du die 3. Ebene jetzt löschen kannst, bekommst du spätestens probleme bei der 4. Ebene, usw...
              Mysql kann von hause aus rekursiv löschen.
              In der Grundeinstellung bis zu einer Tiefe von 15.
              Wir werden alle sterben

              Kommentar


              • #8
                ich hab es so gelöst

                wenn es eine elegantere Lösung gibt, wäre ich über einen Tipp sehr dankbar

                PHP-Code:
                 $check_menue_id $_GET['id2delete'];
                  
                $get_ids_to_delete = Array();
                  for(
                $i=0$i<3$i++)
                  {
                       
                $checkout "SELECT
                                           id,
                                           menue_id
                                      FROM
                                           menue
                                       WHERE
                                           sprache = '"
                .$_SESSION['sprachen_id']."' AND
                                           site_id = '2' AND
                                           menue_id = '
                $check_menue_id';";
                        
                $checkoutresults mysql_query($checkout) OR die (mysql_error());
                        while(
                $getcheckedresults mysql_fetch_assoc($checkoutresults))
                         {
                          
                $check_menue_id =  $getcheckedresults['id'];
                          
                $get_ids_to_delete[] = $getcheckedresults['id'];
                          
                $checkout_2 "SELECT
                                            id,
                                            menue_id
                                           FROM
                                            menue
                                           WHERE
                                            sprache = '"
                .$_SESSION['sprachen_id']."' AND
                                            site_id = '2' AND
                                            menue_id = '
                $check_menue_id';";
                          
                $checkoutresults_2 mysql_query($checkout_2) OR die (mysql_error());
                          while(
                $getcheckedresults_2 mysql_fetch_assoc($checkoutresults_2))
                           {
                           
                $get_ids_to_delete[] = $getcheckedresults_2['id']; 
                           }
                           
                           }                     
                         
                          }
                  
                  
                  foreach(
                $get_ids_to_delete as $menue_ids)
                   {
                    
                $sql "DELETE FROM menue WHERE id = '$menue_ids' OR id = '".$_GET['id2delete']."';";
                    
                mysql_query($sql) OR die (mysql_error());
                   } 

                Kommentar


                • #9
                  Du hast schon wieder das Escaping vergessen. Sowas darf nicht vorkommen! Das ist kein Spaß.

                  Kommentar

                  Lädt...
                  X