Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Abfrage 2 Datenbanken, Array?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Abfrage 2 Datenbanken, Array?

    Hallo zusammen!

    Ich stehe im Moment auf dem Schlauch, vielleicht könnt ihr mir ja den hilfreichen Kick geben

    Folgende Ausgangssituation:

    zwei Datenbanken.

    DB 1:
    ID.....Rubrik......Beschreibung
    1........1...........Amerika
    2........3...........Asien

    DB 2:
    ID......Rubrik.......thema......link
    1........1...............Boston.....bos
    2........1...............NY...........ny
    3........3...............Hongkong...hk


    Das ganze soll nun nach Rubriken sortiert aufgelistet werden, über jeder Liste die Beschreibung erscheinen.
    Also so:

    Amerika
    * Boston
    * New York

    Asien
    * Hongkong


    Auflisten, sortieren - kein Problem, einfache while-Schleife. Aber wie bekomme ich die Überschrift vor die Liste?
    Ich habe schon überlegt ob man die 1. Datenbank in ein Array laden sollte (habe ich noch nicht ganz durchstiegen wie das funktioniert), aber auch hier würde ja die while-Schleife der Auflistung von der 2. Datenbank jeweils unterbrochen?
    Gibts da elegantere Lösungsansätze?

  • #2
    Deine Idee ist gar nicht so schlecht, so macht man das:
    http://www.php.de/wiki-php/index.php...rdverfahren%29

    PS: Nur mal so ne Frage am Rande, aber sind das wirklich 2 Datenbanken oder nur 2 Tabellen die du uns da gezeigt hast?

    Kommentar


    • #3
      ja, hast natürlich recht - zwei Tabellen in einer Datenbank. Hab ich nicht aufgepasst beim tippen.

      Ich danke herzlich für eine Antwort und ziehe mir das jetzt mal rein

      Kommentar


      • #4
        Aaaaalso bislang habe ich jetzt folgendes zusammen geschrieben:

        PHP-Code:
        <?
        $beschreibung = array(); 
        $ergebnis_rubrik = mysql_query("SELECT * FROM $table2 ORDER BY rubrik") or die(mysql_error()); 
        while($row = mysql_fetch_assoc($ergebnis_rubrik)) { 
        $beschreibung[] = $row['beschreibung'];
        }

        foreach ($beschreibung as $entry) {
        echo $entry;

        ?>
        <ul class="text">
        <?

        $result = mysql_query("SELECT * FROM $table") or die(mysql_error()); 
        while($row = mysql_fetch_assoc($result)) { 
        ?> 
        <li>
        **Auflistung**
        </li>
        <?
        }
        ?>
        </ul>
        <?

        mysql_close($db);
        ?>
        1. es kommen die gewünschten Überschriften
        2. es wird danach die Auflistung gemacht
        schonmal super

        Aber
        3. es wird natürlich immer die komplette Auflistung gemacht, denn wie ich diese Auflistungen nun auf eine Rubrik eingrenzen kann ist mir noch nicht so klar. Am einfachsten natürlich über ein WHERE in der SQL-Abfrage bei der Tabelle 1 (db1), den dazugehörigen Wert bekomme ich ja aus der Tabelle 2 (db2) in der Spalte Rubrik. Wie bekomme ich diesen Wert nun aber in eine Variable?

        Kommentar


        • #5
          Sortier beide Abfragen nach Rubrik_ID, speichere alle Rubriken in einem Array und laufe dann die Themen durch, immer wenn sich die Rubrik ändert, gibst du zuerst die neue aus.

          Kommentar


          • #6
            JOIN + Gruppenbruch

            Kommentar


            • #7
              Habe jetzt leider noch nicht verstanden was ihr meint...

              Kommentar


              • #8
                Dann schau dir nochmal den Link an den ich gepostet habe, da geht es um den Gruppenbruch.

                Kommentar


                • #9
                  sorry, mir fehlt nach wie vor der entscheidende Denkanstoß, ich komm nicht weiter... ich mach das nicht beruflich, hab PHP auch nie irgendwie gelernt sondern wurschtel mich bislang so durch - und finde das im Moment richtig schwer.

                  Jetzt schreibt ihr "Join + Gruppenbruch":
                  In db2 habe ich die Überschrift (=beschreibung) raus gezogen, in ein Array gepackt und als Überschrift der Auflistung ausgegeben. Aus der db1 will ich nun die Elemente raus ziehen, deren Rubrik mit der Rubrik der Überschrift über ein stimmt.

                  Wie verknüpfe ich da jetzt die Datenbankabfrage?
                  SELECT * FROM db2 JOIN db1 ON db2.rubrik = db1.rubrik WHERE db1.beschreibung = $entry
                  ????

                  Danke

                  Kommentar


                  • #10
                    SELECT * FROM db2 JOIN db1 ON db2.rubrik = db1.rubrik WHERE db1.beschreibung = $entry
                    Ja, so in der Art, nur ohne SELECT * und mit einem ORDER BY db1.rubrik

                    Weil, wenn du dir jetzt die Daten mal anschaust, siehst du das du alle Informationen zusammenhast, die du brauchst für deine Ausgabe. Eine while Schleife, den Gruppenbruch organisiert du über "rubrik".

                    Infos zum Gruppenbruch findest du beispielsweise hier: http://www.php.de/wiki-php/index.php...rdverfahren%29

                    Kommentar


                    • #11
                      Zitat von lstegelitz Beitrag anzeigen
                      Ja, so in der Art, nur ohne SELECT * und mit einem ORDER BY db1.rubrik

                      Weil, wenn du dir jetzt die Daten mal anschaust, siehst du das du alle Informationen zusammenhast, die du brauchst für deine Ausgabe. Eine while Schleife, den Gruppenbruch organisiert du über "rubrik".

                      Infos zum Gruppenbruch findest du beispielsweise hier: http://www.php.de/wiki-php/index.php...rdverfahren%29
                      Der Link war oben schon mal verlinkt, bin ich aber zu doof für - ich kapiers nicht

                      Fangen wir ganz vorne an: Ist das was ich oben machte gänzlich falsch, unsinnig, oder in Teilen richtig und es fehlt nur was?

                      Eine SQL-Abfrage OHNE Select? Geht das überhaupt?
                      Ich mache ja oben zwei SQL-Abfragen. Wenn ich dich jetzt richtig verstanden habe würde eine Abfrage (mit JOIN) reichen?

                      Kommentar


                      • #12
                        Du bist schon auf dem richtigen Weg, zumindest mit dem JOIN
                        Die Benennung der Tabellen ist Käse. Aussagekräftige Namen verwenden, sowohl bei Tabellen und Feldern der Datenbank, als auch im Code bei Variablen und Funktionen!
                        Die Beziehung zwischen Tabellen stellst du am besten über PK/FK (Prmiary Key/Foreign Key) her, eine Extraspalte "Rubrik" brauchst du dann nicht mehr. Stattdessen könntest du ein sort_order Feld mitführen (muss aber nicht).
                        table rubrik:
                        ID.....Beschreibung
                        1........Amerika
                        2........Asien

                        table cities:
                        ID......rubrik_id.......thema......link
                        1........1...............Boston.....bos
                        2........1...............NY...........ny
                        3........3...............Hongkong...hk
                        Dann spricht man die Felder der Tabellen direkt an. SELECT * ist aus diversen Gründen verpönt, die du mal in einer ruhigen Minute recherchieren kannst.
                        Code:
                        SELECT 
                          rubrik.Beschreibung, 
                          cities.ID, cities.thema, cities.link
                        FROM 
                          cities
                        LEFT JOIN 
                          rubrik 
                        ON 
                          rubrik.id = cities.rubrik_id 
                        ORDER BY
                          rubrik.beschreibung ASC,
                          # weitere Sortierkriterien können angegeben werden
                          cities.thema DESC
                        Der Gruppenbruch funktioniert nur auf einer Menge die primär nach dem Gruppenkriterium sortiert ist. Dadurch stehen alle Daten der gleichen Gruppe hintereinander.
                        Pseudocode
                        PHP-Code:
                        $sql 's.o.';
                        $result query($sql);
                        $group null;
                        while (
                        $row fetch_array($result)) {
                          
                        // Starte neue Gruppe falls nötig
                          
                        if ($group != $row['rubrik.Beschreibung']) {
                             
                        $group $row['rubrik.Beschreibung']; // aktuelle Gruppe merken!
                             
                        echo '<h1>'.$group.'</h1>';
                          }
                          
                        // Standardausgabe
                          
                        echo '<p>'.$row['cities.thema'].'</p>';

                        Probier das mal zu übertragen, ganz will ich dir die Arbeit ja nicht abnehmen.

                        Kommentar


                        • #13
                          Zitat von lstegelitz Beitrag anzeigen
                          Die Benennung der Tabellen ist Käse. Aussagekräftige Namen verwenden, sowohl bei Tabellen und Feldern der Datenbank, als auch im Code bei Variablen und Funktionen!
                          Das ist hier schon der Fall, ich wollte die nur nicht ins Forum übernehmen sondern ein "einfacheres" Beispiel verwenden. Gut, war ein Schuß in Ofen, hatte ich selbst schon bemerkt.


                          Probier das mal zu übertragen, ganz will ich dir die Arbeit ja nicht abnehmen.
                          Das ist schon richtig so - ich wills ja verstehen und nicht den Gutenberg machen.

                          =====

                          Also, du machst jetzt nur EINE Datenbankabfrage und durchläufst dann eine IF-Schleife wo du schlicht prüfst ob die aktuelle Überschrift mit der Überschrift im alten Durchlauf überein stimmt. Soweit ist mir das klar...


                          Bei der Ausgabe der Tabellendaten in das Array meldet mein Browser "Fatal error: Call to undefined function fetch_array()"
                          Google findet da eher mysql_fetch_array, aber dann hagelt es mir auch eine Fehlermeldung.

                          Ich habe deine while-Schleife auch testweise mal gegen eine "normale" SQL-Ausgabe getauscht und festgestellt dass überhaupt keine Tabelleninhalte ausgegeben werden. So einen Join habe ich noch nie gemacht, stimmt bei der Datenbank-Abfrage schon etwas nicht? Spreche ich die Zellen falsch an?

                          PHP-Code:
                          $db = @ mysql_connect("$DBHost","$DBUser","$DBPass");  
                          mysql_select_db($DBName,$db);  

                          $sql 'SELECT  
                                    gallery_rubrik.beschreibung,   
                                    gallery_navi.id, gallery_navi.thema, gallery_navi.link, gallery_navi.datum
                                  FROM  
                                    gallery_navi 
                                  LEFT JOIN 
                                    gallery_rubrik 
                                  ON 
                                    gallery_rubrik.id = gallery_navi.rubrik_id
                                  ORDER BY
                                    gallery_rubrik.beschreibung ASC'

                          $result mysql_query $sql ); 
                          $group null;  
                          echo 
                          mysql_error();   


                          while (
                          $row fetch_array($result) or die(mysql_error())); 
                            {  
                          // Starte neue Gruppe falls nötig  
                              
                          if ($group != $row['gallery_rubrik.beschreibung']) {  
                                  
                          $group $row['gallery_rubrik.beschreibung']; // aktuelle Gruppe merken!  
                                  
                          echo '<h1>'.$group.'</h1>';  
                              }  
                          // Standardausgabe  
                             
                          echo '<p>'.$row['gallery_navi.thema'].'</p>';  
                          }  

                          Kommentar


                          • #14
                            PHP-Code:
                            while ($row fetch_array($result) or die(mysql_error())); 
                            Da steckt der Wurm drin, gleich doppelt.

                            fetch_array() gibt es nicht => mysql_fetch_array()
                            Und: Das Semikolon am Ende muss weg!

                            Kommentar


                            • #15
                              aaach Gott, while-Schleife mit Strickomma am Ende manchmal sieht man den Wald vor lauter Bäumen nicht. Ist ja klar das sowas nicht geht. Beim mysql_fetch.. hatte ich ja zuminest schon die Fährte erschnüffelt

                              Die Ausgabe bleibt dennoch leer, es wird nichts an den Schirm geworfen. Ich habe daher mit print_r mal das ganze Array ausgeben lassen.

                              Array ( [0] => Amerika [navi_beschreibung] => Amerika [1] => 1 [id] => 1 [2] => Boston [thema] => Boston [3] => Boston am Hudson-River [beschreibung] => Boston am Hudson-River [4] => Herbst 2008 + Sommer 2009 [datum] => Herbst 2008 + Sommer 2009 )
                              usw.

                              Die If-Schleife gibt wie gesagt nichts aus. Gucke ich mir das ausgegebene Array an, so steht da als Schlüssel ja nicht [gallery_rubrik.beschreibung] sondern nur [beschreibung]. In der While-Schleife nach dem fetch_array spreche ich daher nur noch die Spalten als Schlüsselbezeichnung an und kann die Tabelle weg lassen. Korrekt? Funktioniert zumindest, also wird stimmen.

                              Für den Abschluss des Listen-Tags ( </ul> ) habe ich nochmals eine if-Schleife eingebaut, funktioniert auch.
                              Geil.

                              Danke für deine Hilfe Wo ist der Paypal-Donate Button?


                              PHP-Code:
                              <?
                              $db = mysql_connect("$DBHost","$DBUser","$DBPass");  
                              mysql_select_db($DBName,$db);  
                              $sql = "SELECT  
                                        $table2.navi_beschreibung,   
                                        $table.id, $table.thema, $table.beschreibung, $table.datum, $table.aktiv
                                      FROM  
                                        $table 
                                      LEFT JOIN 
                                        $table2 
                                      ON 
                                        $table2.id = $table.rubrik_id
                                      WHERE
                                        $table.aktiv = '1'
                                      ORDER BY
                                        $table2.navi_beschreibung ASC"; 
                              $result = mysql_query($sql); 
                              $group = null;  
                              $group_alt = null; 

                              while ($row = mysql_fetch_array($result))
                                { 
                              // print_r ( $row );

                              // Starte neue Gruppe falls nötig  
                                 if ($group != $row['navi_beschreibung']) {  
                                     // aktuelle Gruppe merken!  
                                     $group = $row['navi_beschreibung']; 

                                     // Pruefen ob aktuelle Gruppe vorher schon da war
                                     if (($group_alt != $group) AND ($group_alt != null)) {
                                         ?></ul><?
                                     }       
                                     ?>
                                     
                              <p class="ueberschrift"><?php echo $group?></p>
                                     <ul class="text">
                                     <? 
                                  }
                                  $group_alt = $group;  
                              // Standardausgabe  
                                  ?>
                                  <li>
                                  <a href="start.php?n=2&s=foto_gal&thema=<?php echo $row['thema']; ?>" class="boxlink"><?php echo $row['beschreibung']; ?></a> (<?php echo $row['datum']; ?>)
                                  </li>
                                  <?
                              }  


                              }

                              Kommentar

                              Lädt...
                              X