Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Abfrage mehrer Tabellen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Abfrage mehrer Tabellen

    Hallo,
    ich versuche innerhalb einer Bildgalerie Folgendes zu realisieren:
    1. Thema auswählen
    2. Aus einer m:n-Tabelle die zugehörigen Alben ermitteln
    3. Titelfotos der Alben (Fotobeschreibung = 00%) in einer Reihe anzeigen
    Foto "00" Foto "00"
    Album 1 Album 2 ................
    4. Unter den Fotos Links zu den Alben
    Album 1
    Album 2
    .
    .
    .

    4. Die Reihenfolge der Fotos und der Album-Links aus der m:n-Tabelle thema_alben.Folge ist die gleiche.

    Habe verschiedene Konfigurationen der Abfrage ausprobiert aber erhalte ständig Fehlermeldungen zu verschiedenen Zeilen.
    Meine Abfrage:
    PHP-Code:
    $sql "SELECT
                    thema_ID,
                    thema_Name AS Themabez,
                    thema_Beschreibung,
                    thema.Datum AS Datum,
                    alben_ID,
                    Alben.Name,
                    Alben.Beschreibung,
                    fotos_ID AS Fotonr,
                    fotos.Name AS Fotobez,
                    fotos.Alben_ID,
                    fotos.Beschreibung,
                    thema_alben.Thema_ID,
                    thema_alben.Alben_ID,
                    thema_alben.Folge AS Reihenfolge
            FROM
                    fotos
            JOIN
                       thema      
            ON 
                    thema.ID = '11'
            JOIN
                    thema_alben
            ON
                    thema_alben.thema_ID = thema.ID
            AND
                    thema_alben.alben_ID = alben.ID
            JOIN
                    alben
            ON
                    alben.ID = fotos.Alben_ID
            AND
                    fotos.Beschreibung = 00% 
            ORDER BY
                    thema_alben.Folge 
           "

    Bei dieser Konfiguration erhalte ich die Meldung:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY thema_alben.Folge' at line 34

    Die 4 Tabellen sind:
    thema ID, Name, Beschreibung
    alben ID, Name, Beschreibung
    thema-alben Thema_ID, Alben_ID, Folge
    fotos ID, Name, Alben_ID, Beschreibung

    So sieht z.B. die thema-alben-Tabelle für Thema ID=11 aus:
    ID thema_ID alben_ID Folge
    49 11 44 1
    50 11 45 2
    51 11 46 3
    75 11 68 4


    Kann mir jemand helfen und mir meinen Fehler zeigen? Wäre sehr dankbar, sitze schon 2 Tage darüber.


  • #2
    Zitat von Hardyy Beitrag anzeigen
    Bei dieser Konfiguration erhalte ich die Meldung:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY thema_alben.Folge' at line 34
    Die Stelle die nach »near« in der Fehlermeldung steht ist idR direkt nach dem Fehler, bei dir liegt das Problem in der Zeile »fotos.Beschreibung = 00%« da das »00%« gerne ein String sein möchte.

    Kommentar


    • #3
      Zitat von tk1234 Beitrag anzeigen
      Die Stelle die nach »near« in der Fehlermeldung steht ist idR direkt nach dem Fehler, bei dir liegt das Problem in der Zeile »fotos.Beschreibung = 00%« da das »00%« gerne ein String sein möchte.
      die JOIN-Condition für fotos und thema ist eher was für das WHERE.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Wenn ich es richtig verstanden habe, so sieht die Abfrage jetzt aus:
        Code:
                FROM
                		fotos
                JOIN
                   		thema      
                WHERE 
                		thema.ID = '11'
                JOIN
                		thema_alben
                ON
                		thema_alben.thema_ID = thema.ID
                AND
                		thema_alben.alben_ID = alben.ID
                JOIN
                		alben
                ON
                		alben.ID = fotos.Alben_ID
                AND
                		fotos.Beschreibung = '00%' 
                ORDER BY
                		thema_alben.Folge 
                 
        
        You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN thema_alben ON thema_alben.thema_ID = thema.' at line 22
        WHERE an der richtigen Stelle? Warum nicht ON?
        '00%' jetzt in Anführungszeichen.
        Trotzdem die Fehlermeldung.

        Kommentar


        • #5
          Code:
          JOIN
             thema      
          WHERE
          Das stimmt so nicht, WHERE gehört "zum Schluss".

          Code:
          JOIN ...
          ...
          JOIN ...
          ...
          WHERE ...
          ...
          ORDER BY ...
          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Jetzt habe ich es fast geschafft.
            1) Thema ausgewählt - OK (aktuell ID=11)
            2) Tabellen- JOIN-verknüpfung - OK
            3) Thema-Beschreibung angezeigt und die Anzahl der Titelfotos der zugehörigen Alben - OK (aktuell 4)
            4) Alle Thumbnails der Titelbilder in einer Reihe (aktuell 4) NICHT OK - angezeigt werden nur 3, das erste fehlt!
            5) Links mit den Albennamen und der darin enthaltenen Fotos - OK (aktuell 4)

            So sieht z.B. die thema-alben-Tabelle für Thema ID=11 aus:
            ID thema_ID alben_ID Folge
            49 11 44 1
            50 11 45 2
            51 11 46 3
            75 11 68 4

            kpl. Skript:
            PHP-Code:
            <?php
              error_reporting
            (E_ALL);

                  echo 
            "<h1>Galerie - Thema</h1>\n";
                  
            $error '';
                  
            // 1) Prüfen ob thema_ID vom Menü Übergeben wurde und numerisch ist

                  
            if(!isset($_GET['id']) OR !is_numeric($_GET['id'])){
                      
            $error "Sie haben kein Thema ausgewählt.<br />\n";                                  
                  }
                  else{
                      
            // $_GET_Wert sichern
                      
            $_GET['id'] = (int)mysql_real_escape_string($_GET['id']);
                  }

                    if(
            $error != '')
                    echo 
            $error;
                     
                      else{
                         
            // 2) Tabellen-Verknüpfung - Auswahl eines Thema
                   
                        
            $sql "SELECT
                                        thema.Name AS Thbez,
                                        thema.Beschreibung AS Thtext,
                                        thema.Datum AS Datum,            
                                        fotos.Alben_ID,
                                        fotos.ID AS Fotonr,
                                        fotos.Name AS Fotobez,
                                        fotos.Beschreibung AS Fototext,
                                        thema_alben.Folge AS Reihenfolge,
                                        alben.ID,
                                        alben.Name AS Album
                                FROM
                                        fotos
               
                                JOIN
                                        thema
                                 ON 
                                         thema.ID = '"
            .$_GET['id']."'    
                         
                                JOIN
                                        thema_alben
                                ON  
                                         thema_alben.thema_ID = thema.ID
                     
                                JOIN
                                        alben   
                                ON
                                        thema_alben.alben_ID = alben.ID     
                                AND
                                        fotos.Alben_ID = alben.ID
                                AND
                                        fotos.Beschreibung like '00%' 
                
                                 ORDER BY
                                        Reihenfolge ASC
                                "
            ;   
             
                     
            // 3) Anzeige des gewählten Thema, Datum und Anzahl der Titelfotos
                        
                    
            $result mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
                    
            $anzahl_fotos mysql_num_rows($result);
                    
            $row mysql_fetch_assoc($result);
                    echo 
            "<b>"."Name: ".$row['Thbez']."\n</b><br /><br />".
                         
            "".$row['Thtext']."\n<br />"
                         
            "Datum: ".$row['Datum']."\n<br />".
                         
            "Fotos: ".$anzahl_fotos."\n<br />".
                         
            "<br />";          
                    }
                    
                   
                    if(!
            $anzahl_fotos){
                        echo 
            "<p>\n".
                             
            "Es befinden sich keine Fotos in diesem Album.\n".
                             
            "</p>\n";
                    }
                    
            // 4) Alle Thumbnails reihenweise anzeigen (jeweils 1 (Titel-)Foto der zum Thema passenden Alben)
            //    Reihenfolge der Fotos bzw. der Alben festgelegt unter thema_alben.Folge
             
                    
            else{
                        
            $i=0;
                        while(
            $row mysql_fetch_assoc($result)){
                            
            $float 'left';
                            echo 
            "<a href=\"index.php?s=detail_titelbild&id=".$row['Fotonr']." \">".
                                 
            "<img style=\"border: 5px solid #000000;float:".$float.";\" src=\"".TN_FOLDER."/TN".substr($row['Fotobez'],3)."\" alt=\"".$row['Fototext']."\" />\n"
                                 
            "</a>";                     
                        
            $i++;
                        }             
                       echo 
            "<br style=\"clear:both;\"/>\n";           
                    }
                    
            // 5) Links zu den Alben des gewählten Thema und Anzahl der Fotos im jeweiligen Album       
                    
                    
            $result mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error()); 
                    if(!
            mysql_num_rows($result)){
                          echo 
            "<p>\n".
                                 
            "Es befinden sich keine Alben in der Datenbank\n".
                                 
            "</p>\n";
                    }
                    while(
            $row mysql_fetch_assoc($result)){
                      
            $sql "SELECT
                                      COUNT(ID)
                              FROM
                                      fotos
                              WHERE
                                      Alben_ID = '"
            .$row['ID']."'        
                                  
                         "
            ;
                      
            $result_anzahl mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
                      
            $anzahl_fotos mysql_result($result_anzahl0);
                      echo 
            "<dl>\n".
                            
            "<dt><a href=\"index.php?s=overview&id=".$row['ID']."\">".$row['Album']."</a> - (".$anzahl_fotos." Fotos)</dt>\n".
                       
            "</dl>\n";
                    }
             
                echo 
            "<br />\n".
                         
            "&raquo; <a href='javascript:history.back()'> Zurück zur Übersicht</a>\n";
            ?>
            Wäre jemand so nett und sieht sich die while-Schleife unter 4) an?
            Keine Ahnung warum das erste Thumbnail nicht angezeigt wird.
            Vielleicht nur eine Kleinigkeit, die ich dauern übersehe.

            Kommentar


            • #7
              Zitat von Hardyy Beitrag anzeigen
              Wäre jemand so nett und sieht sich die while-Schleife unter 4) an?
              Keine Ahnung warum das erste Thumbnail nicht angezeigt wird.
              Direkt nach mysql_query() und mysql_num_rows() rufst du einmal mysql_fetch_assoc() auf - damit ist beim ersten Aufruf von mysql_fetch_assoc() weiter unten in der while-Schleife der erste Datensatz bereits weg und die Schleife fängt beim zweiten Datensatz an.

              Kommentar


              • #8
                Zitat von tk1234 Beitrag anzeigen
                Direkt nach mysql_query() und mysql_num_rows() rufst du einmal mysql_fetch_assoc() auf - damit ist beim ersten Aufruf von mysql_fetch_assoc() weiter unten in der while-Schleife der erste Datensatz bereits weg und die Schleife fängt beim zweiten Datensatz an.
                Danke für die Analyse. Damit ist das Problem erkannt.
                Aber wie löse ich das Problem?
                Habe Folgenes mit der for-Schleife versucht:
                PHP-Code:
                // 4) Alle Thumbnails reihenweise anzeigen (jeweils 1 (Titel-)Foto der zum Thema passenden Alben)
                //    Reihenfolge der Fotos bzw. der Alben festgelegt unter thema_alben.Folge
                 
                        
                else{
                            for (
                $i=0$i<count($anzahl_fotos); $i++){

                                
                $float 'left';
                               
                                echo 
                "<a href=\"index.php?s=detail_titelbild&id=".$row[$i]['Fotonr']." \">".
                                     
                "<img style=\"border: 5px solid #000000;float:".$float.";\" src=\"".TN_FOLDER."/TN".substr($row[$i]['Fotobez'],3)."\" alt=\"".$row[$i]['Fototext']."\" />\n"
                                     
                "</a>";         
                               }          
                               echo 
                "<br style=\"clear:both;\"/>\n";           
                        } 
                Da bekomme ich aber nur Fehlermeldung: Notice: Undefined offset: 0 on line 91.
                Meiner Meinung nach ist die Sytax der Schleife OK oder nicht?
                Kannst Du mir bitte einen Tip geben?

                Kommentar


                • #9
                  Habe auch versucht den Teil 4) in den Teil 3 zu implementieren:
                  PHP-Code:
                  // 3) Anzeige des gewählten Thema, Datum und Anzahl der Titelfotos
                              
                          
                  $result mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
                          
                  $anzahl_fotos mysql_num_rows($result);
                          
                          while(
                  $row mysql_fetch_assoc($result)){
                          echo 
                  "<b>"."Name: ".$row['Thbez']."\n</b><br /><br />".
                               
                  "".$row['Thtext']."\n<br />"
                               
                  "Datum: ".$row['Datum']."\n<br />".
                               
                  "Fotos: ".$anzahl_fotos."\n<br />".
                               
                  "<br />";
                           
                  $i=0;    
                                  
                  $float 'left';
                                  echo 
                  "<a href=\"index.php?s=detail_titelbild&id=".$row['Fotonr']." \">".
                                       
                  "<img style=\"border: 5px solid #000000;float:".$float.";\" src=\"".TN_FOLDER."/TN".substr($row['Fotobez'],3)."\" alt=\"".$row['Fototext']."\" />\n"
                                       
                  "</a>";                     
                              
                  $i++;
                              }             
                             echo 
                  "<br style=\"clear:both;\"/>\n";           
                          }
                        
                          if(!
                  $anzahl_fotos){
                              echo 
                  "<p>\n".
                                   
                  "Es befinden sich keine Fotos in diesem Album.\n".
                                   
                  "</p>\n";
                          } 
                  Jetzt bekomme ich aber zuviel des Guten. Auch die Themabeschreibung erscheint ungewollt 4-mal.

                  Kommentar


                  • #10
                    Jetzt bekomme ich aber zuviel des Guten. Auch die Themabeschreibung erscheint ungewollt 4-mal.
                    Ok, und was ist deine konkrete Frage? Schon mal im PMA oder eine SQL Client geschaut was die Query überhaupt "roh" zurückgibt?

                    Schau dir mal den Gruppenbruch für die Ausgabe an (gerade wenn SQL-JOINS mit dabei sind), vermutlich ist das was du brauchst: http://php-de.github.io/jumpto/gruppenbruch/

                    Ansonsten: Finde heraus was falsch läuft: http://php-de.github.io/jumpto/leitfaden/
                    Für SQL: http://php-de.github.io/jumpto/sql/

                    Übrigens ist die mysql_ Erweiterung veraltet und wird bald nicht mehr funktionieren, da diese aus PHP rausfliegt. http://php-de.github.io/jumpto/faq/#deprecated-mysql (ganz unten).

                    LG
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Zitat von hausl Beitrag anzeigen
                      Ok, und was ist deine konkrete Frage? Schon mal im PMA oder eine SQL Client geschaut was die Query überhaupt "roh" zurückgibt?
                      Im Beitrag #6 ist alles genau dargelegt.
                      Im Beitrag #9 ist zu sehen wie ich Skriptteil 3) + 4) zusammengelegt habe

                      Was ich bekomme?

                      Fast genau das, was ich im Beitrag #6 angestrebt habe. aber eben nur fast.

                      Wenn der Skripteil im Beitrag#9 so funktionieren würde, so wie ich es naiv zusammengeschrieben habe und zwar die ersten echo-Zeilen nur einmal (Thema-Beschreibung) und die echo-Zeile innerhalb der Zählschleife so oft , wie es Bilder gibt, wäre mein Problem gelöst.

                      So bekomme ich aber auch die Themabeschreibung so oft es Bilder gibt.

                      Und die Frage? Wie mache ich das richtig?

                      Danke für die Links.Die schaue ich mir an, ob sie mir helfen können.

                      Kommentar


                      • #12
                        Zitat von Hardyy Beitrag anzeigen
                        Und die Frage? Wie mache ich das richtig?
                        Ich habe es geschafft. Ob es ganz richtig und effizient ist, ist eine andere Frage. Aber da keine weiteren Vorschläge von Euch gekommen sind habe ich durch's Probieren eine Lösung gefunden. Jetzt funktioniert alles, wie ich es mir vorgstellt habe.
                        Sollte es jemand interessieren, hier das kpl. Skript:
                        PHP-Code:
                        <!--  galerie.php - ######################## Galerie-Thema ########################  -->

                         <?php
                         error_reporting
                        (E_ALL);

                              echo 
                        "<h1>Galerie - Thema</h1>\n";
                              
                        $error '';
                              
                        // Prüfen ob thema_ID vom Menü Übergeben wurde und numerisch ist

                              
                        if(!isset($_GET['id']) OR !is_numeric($_GET['id'])){
                                  
                        $error "Sie haben kein Thema ausgewählt.<br />\n";                                  
                              }
                              else{
                                
                        // $_GET_Wert sichern
                                
                        $_GET['id'] = (int)mysql_real_escape_string($_GET['id']);
                                  
                                    
                        $sql "SELECT
                                                    Name,
                                                  Beschreibung,
                                                  DATE_FORMAT(Datum, '%d.%m.%Y') as Datum
                                           FROM
                                                  thema
                                           WHERE
                                                  ID = '"
                        .$_GET['id']."'
                                          "
                        ;
                                
                        $result mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
                                
                        $row mysql_fetch_assoc($result);

                        // Thema-Beschreibung anzeigen
                                
                                
                        echo "Name: ".$row['Name']."\n<br />".
                                     
                        "".$row['Beschreibung']."\n<br />"
                                     
                        "Datum: ".$row['Datum']."\n<br />".
                                     
                        "<br />\n";
                                }
                                if(
                        $error != '')
                                echo 
                        $error;
                                
                        // Tabellen-Verknüpfung - Auswahl eines Thema
                                
                                
                        else{       
                                    
                        $sql "SELECT
                                                    thema.Name AS Thbez,
                                                    thema.Beschreibung AS Thtext,
                                                    thema.Datum AS Datum,            
                                                    fotos.Alben_ID,
                                                    fotos.ID AS Fotonr,
                                                    fotos.Name AS Fotobez,
                                                    fotos.Beschreibung AS Fototext,
                                                    thema_alben.Folge AS Reihenfolge,
                                                    alben.ID,
                                                    alben.Name AS Album
                                            FROM
                                                    fotos  
                                            JOIN
                                                    thema
                                            ON 
                                                    thema.ID = '"
                        .$_GET['id']."'                
                                            JOIN
                                                    thema_alben
                                            ON  
                                                    thema_alben.thema_ID = thema.ID         
                                            JOIN
                                                    alben   
                                            ON
                                                    thema_alben.alben_ID = alben.ID     
                                            AND
                                                    fotos.Alben_ID = alben.ID
                                            AND
                                                    fotos.Beschreibung like '00%' 
                                            ORDER BY
                                                    Reihenfolge ASC
                                            "
                        ;   
                                    
                                
                        $result mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
                                
                        $anzahl_fotos mysql_num_rows($result);

                        // Alle Thumbnails reihenweise anzeigen (jeweils 1 (Titel-)Foto der zum Thema passenden Alben)
                        // Reihenfolge der Fotos bzw. der Alben festgelegt unter thema_alben.Folge
                                
                                
                        while($row mysql_fetch_assoc($result)){
                                
                        $i=0;                
                                    
                        $float 'left';
                                    echo 
                        "<a href=\"index.php?s=detail_titelbild&id=".$row['Fotonr']." \">".
                                         
                        "<img style=\"border: 5px solid #000000;float:".$float.";\". 
                                         src=\""
                        .TN_FOLDER."/TN".substr($row['Fotobez'],3)."\" alt=\"".$row['Fototext']."\" />\n"
                                             
                        "</a>";                     
                                    
                        $i++;
                                    }             
                                    echo 
                        "<br style=\"clear:both;\"/>\n";           
                                }     
                                if(!
                        $anzahl_fotos){
                                    echo 
                        "<p>\n".
                                         
                        "Es befinden sich keine Fotos in diesem Album.\n".
                                         
                        "</p>\n";
                                }
                                echo 
                        "<br />";
                                echo 
                        "<b>"."Anzahl der Alben: "."</b>".$anzahl_fotos."\n<br />";
                                
                        // Links zu den Alben des gewählten Thema und Anzahl der Fotos im jeweiligen Album       
                                
                                
                        $result mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error()); 
                                if(!
                        mysql_num_rows($result)){
                                      echo 
                        "<p>\n".
                                             
                        "Es befinden sich keine Alben in der Datenbank\n".
                                             
                        "</p>\n";
                                }
                                while(
                        $row mysql_fetch_assoc($result)){
                                  
                        $sql "SELECT
                                                  COUNT(ID)
                                          FROM
                                                  fotos
                                          WHERE
                                                  Alben_ID = '"
                        .$row['ID']."'        
                                              
                                     "
                        ;
                                  
                        $result_anzahl mysql_query($sql) OR die("<pre>".$sql."</pre>".mysql_error());
                                  
                        $anzahl_fotos mysql_result($result_anzahl0);
                                  echo 
                        "<dl>\n".
                                        
                        "<dt><a href=\"index.php?s=overview&id=".$row['ID']."\">".$row['Album']."</a> - (".$anzahl_fotos." Fotos)</dt>\n".
                                   
                        "</dl>\n";
                                }
                         
                                echo 
                        "<br />\n".
                                     
                        "&raquo; <a href='javascript:history.back()'> Zurück zur Übersicht</a>\n";
                        ?>

                        Kommentar

                        Lädt...
                        X