Checkboxen ankreuzen anhand von DB-Abfrage

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

  • Checkboxen ankreuzen anhand von DB-Abfrage

    Stehe vor einem Problem - vielleicht kann mir ja jemand von Euch einen Tipp geben?!

    Die Texte einer Webseite sind in verschiedene Kategorien eingeteilt:

    TABLE KATEGORIE
    ID | NAME
    -----------------------
    1 | News
    2 | Archiv
    3 | Kommentar
    4 | Artikel
    5 | Lauftext
    usw..


    Die Texte selbst sind in einer extra Tabelle abgelegt:

    TABLE DATEN
    ID | NAME
    ------------------------
    1 | Text1
    2 | Text2
    3 | Text3
    4 | Text4
    usw..

    da aber jeder Text nicht nur in einer Kategorie vorkommen kann, sondern z.B. gleichzeitig in der Kategorie "NEWS" und in der Kategorie "LAUFTEXT", habe ich noch eine 3. Tabelle angelegt, in der die Beziehungen des Textes zu den Kategorien abgespeichert wird:

    TABLE KAT2DATA
    ID | id_data | id_kat
    ---------------------------
    1 | 1 | 1
    2 | 1 | 5
    3 | 2 | 4
    4 | 2 | 2
    5 | 3 | 3
    usw..

    In diesem Bsp. würde also Text1 in der Kategorie NEWS (1) und LAUFTEXT (5) vorkommen, Text2 würde im ARCHIV (2) und in ARTIKEL (4) vorkommen und Text3 wäre der Kategorie KOMMENTAR (3) zugeordnet.

    Hier schonmal meine 1. Frage:
    ist das zu kompliziert gedacht? Kann man es vielleicht eleganter lösen, wenn verschiedene Texte in verschiedenen Kategorien vorkommen sollen?

    Jetzt aber zum eigentlichen Problem:
    Um einen Text bearbeiten zu können, wird er in ein Formular geladen. Das klappt auch ohne Probleme. Nun möchte ich aber gerne, dass beim Bearbeiten des Textes auch sofort die Kategorien angekreuzt werden (über Checkboxen), die zum aktuellen Text gehören.
    Wenn ich also z.B. Text1 zum bearbeiten auswähle, soll dieser in ein Textfeld geladen werden. Gleichzeitig soll aber die Kategorie NEWS und die Kategorie LAUFTEXT angekreuzt werden.
    Hoffe, ich hab mich verständlich ausgedrückt.

    Ich möchte hier sicher keine Fertiglösungen haben - aber vielleicht hat ja jemand eine Idee, wie ich an das Ganze rangehen könnte, bzw. ob ich vielleicht von vorneherein meine Tabellenstruktur ändern sollte usw.
    Bin für jeden Tipp dankbar!

  • #2
    Re: Checkboxen ankreuzen anhand von DB-Abfrage

    Original geschrieben von zzet
    Hier schonmal meine 1. Frage:
    ist das zu kompliziert gedacht? Kann man es vielleicht eleganter lösen, wenn verschiedene Texte in verschiedenen Kategorien vorkommen sollen?
    im gegenteil. das ist eine der elegantesten lösungen, die ich hier je von anfragenden gesehen habe.... ;-)

    wenn du deinen text lädst, hast du ja ne id davon. nun machst du einfach einen select auf die texttabelle mit einen LEFT (OUTER) JOIN zu der kategieen tabelle. mit einer schleife kannst du nun die hacken setzen. ;-)
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Danke für die schnelle Antwort!

      ... das ist eine der elegantesten lösungen, ...
      dann hab ich wohl doch nicht zu kompliziert gedacht - manchmal bin ich mir da nämlich nicht so sicher

      Das mit der ID des Textes ist soweit klar - die habe ich automatisch, sobald ich ihn zum Bearbeiten in das Formular lade.
      Wie das aber mit LEFT (OUTER) JOIN genau funktioniert habe ich noch nicht ganz verstanden.
      Auch macht mir das Hacken setzen ein Problem, da ja Checkboxen irgendwie als Arrays behandelt werden, oder?
      Dass das mit ner Schleife gehen muss dachte ich mir schon, aber wie genau eben nicht.
      Naja.. danke jedenfalls für Deinen Tipp - ich werde jetzt wieder im Buch weiterblättern und schauen, ob ich Deine Vorschläge verwerten kann.
      Wenn es Dich aber in den Fingern juckt, und Du es nicht mehr aushältst, mir nochmal zu helfen, dann trau Dich ruhig

      Kommentar


      • #4
        Wenn es Dich aber in den Fingern juckt, und Du es nicht mehr aushältst, mir nochmal zu helfen, dann trau Dich ruhig
        was ich hiermit mache.....

        aber eine lösung poste ich dir nicht. das willst du ja auch nicht, da du lernen willst.

        aber deine lösung ist keineswegs kompliziert. so ist es supersauber.

        diese abfrage kannst du ja mal testen ....
        Code:
        SELECT * FROM texte LEFT OUTER JOIN kategorieen USING(textid) WHERE textid = 2;
        ... musst nur diene namen nehmen.

        textid ist die id der text-tabelle und gleichzeitig die eine spalte in deiner verknüpfungstabelle.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          falcsher fehler. hab vergessen noch einen join über die verknüpfungsztabelle vergessen.
          hier ist es richtig(er).
          Code:
          SELECT  *
          FROM    texte T
                    LEFT OUTER JOIN texte_kat TK USING(textid)
                      LEFT OUTER JOIN kategorieen K USING(katid)
          WHERE   T.textid = 2
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Danke nochmal!

            ich schau mal, ob ich damit klarkomme. Auch wenn ich nicht ganz verstehe, was in dem SELECT eigentlich gemacht wird, da ich bisher noch nicht mit JOIN usw gearbeitet habe.
            Weiss auch nicht genau, wo ich da im mySQL-Handbuch nachschauen soll.
            Aber mal sehn - ich versuch's jetzt einfach mal.

            Kommentar


            • #7
              hier kannst du nachschlagen.

              http://www.mysql.com/doc/en/JOIN.html

              http://www.mysql.com/doc/en/LEFT_JOIN_optimisation.html

              und hier habe ich das gefunden...

              http://www.mysql.com/search/index.ph...=%2Findex.html
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                Danke für die Links..

                hab jetzt mal folgende Funktion zusammengeschustert..

                PHP-Code:
                <?

                  function &getkatforcheckbox()
                  {
                    global $main, $conf, $_REQUEST;
                    $query = mysql_query("SELECT * FROM ".$main->pretab."dancer1 T
                                                 LEFT OUTER JOIN ".$main->pretab."dancer_kattodancer TK USING(id_dancer)
                                                 LEFT OUTER JOIN ".$main->pretab."dancer_kategorien K USING(id_kat)
                                                 WHERE T.id_dancer = 2");
                    $checkbox = "";
                    while ($row = mysql_fetch_array($query))
                      {
                          if($row['id']) $checkbox .= "<input type=\"checkbox\" name=\"id_kat[]\" value=\"".$row[id]."\" checked>".$row[id]."<br>";
                          else $checkbox .= "<input type=\"checkbox\" name=\"id_kat[]\" value=\"".$row[id]."\">".$row[id]."<br>";
                      }
                    return $checkbox;
                  }
                  
                ?>
                der SELECT funktioniert auch super.
                Nur bekomme ich es einfach noch nicht hin, dass mir die Checkboxen sämtlicher Kategorien ausgegeben werden und nur die angekreuzt werden, die zum Datensatz passen.
                Es werden immer nur die ausgegeben, in denen der Datensatz vorkommt - die anderen Kategorien werden garnicht erst dargestellt.
                Es liegt natürlich irgendwo in der Schleife - werde wohl erstmal ne Pause machen, um den Kopf ein bisschen frei zu bekommen

                Kommentar


                • #9
                  lade dir alle markierten CBs in ein array. nun kannst du NUR auf die kat's einen SELECT machen und in der schleife bei der darstellung mit in_array() testen, ob der hacken rein muss.
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Das war der Tip, den ich noch gebraucht habe..
                    Eigentlich recht simpel, das mit in_array() zu lösen, aber SEHR effektiv!

                    Vielen Dank für Deine ausführliche Hilfe - so macht das Lernen Spass! Jetzt gönn ich mir ein Feierabend-Bier uns stoss auf Dich an!

                    Kommentar


                    • #11
                      jo. denn mal prost ...

                      und nebenbei. so macht auch helfen spass....
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar

                      Lädt...
                      X