[PHP] MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Judoki, 14. Mai 2012 .

  1. 14. Mai 2012
    Zuletzt bearbeitet: 14. Mai 2012
    MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    Ich möchte eine SQL Abfrage machen, mit der ich auf der Homepage eine Tabelle angezeigt bekomme. Die Tabelle sollte aus 2 MySQL Tabellen generiert werden. Nun weiß ich, dass ich dazu einen JOIN-Befehl brauche, weiß aber nicht wie genau dieser aussehen muss.

    Das Ganze sieht bisher so aus und funktioniert auch mit der einen SQL-Tabelle "daten":

    PHP:
    <? php
        
        $mysql_h 
    'localhost' $mysql_u  'xy01' $mysql_p  'xyz' $mysql_db  'xy01_1' ;
        
    $mysql  = @ mysql_connect ( $mysql_h $mysql_u $mysql_p );
        
    $db  = @ mysql_select_db ( $mysql_db );

        if( !
    $mysql  || ! $db  )
        {
        print 
    '<b>Sorry</b><br><br>Es gibt momentan leider ein kleines Datenbank-Problem, bitte versuchen Sie es später noch einmal.' ;
        exit;
        }

        
    $Tabelle1 = "daten" ;

        echo 
    "<center><table border=\"2\">" ;
        echo 
    "<tr>" ;
        echo 
    "<th>ID</th>" ;
        echo 
    "<th>Datum</th>" ;
        echo 
    "<th>Uhrzeit</th>" ;
        echo 
    "<th>Start</th>" ;
        echo 
    "<th>Ziel</th>" ;
        echo 
    "<th>Preis in Euro</th>" ;
        echo 
    "<th>Vorname</th>" ;
        echo 
    "<th>Nachname</th>" ;
        echo 
    "<th>Telefon</th>" ;
        echo 
    "<th>E-Mail</th>" ;
        echo 
    "</tr>" ;

        
    $sql  "SELECT * FROM  $Tabelle1  ORDER BY datum, uhrzeit" ;
        
    $ergebnis  mysql_query ( $sql );

        while(
    $array  mysql_fetch_array ( $ergebnis ))
        {
        echo 
    "<tr>" ;
        echo 
    "<td align=\"middle\">" . $array [ "id" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "datum" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "uhrzeit" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "start" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "ziel" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "preis" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "vorname" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "nachname" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "telefon" ]. "</td>" ;
        echo 
    "<td align=\"middle\">" . $array [ "email" ]. "</td>" ;
        echo 
    "</tr>" ;
        }

        echo 
    "</table></center>" ;
        
        
    ?>
    Es geht um diese Zeile, die bisher so aussieht (enthält bisher nur die eine SQL-Tabelle):

    PHP:
    $sql  "SELECT * FROM  $Tabelle1  ORDER BY datum, uhrzeit" ;
    Wie muss ich diese Anweisung nun verändern, wenn ich "benutzer.vorname, benutzer.nachname, benutzer.telefon, benutzer.email" joinen möchte?

    Habe das probiert, hat aber nicht funktioniert:

    PHP:
    $sql  "SELECT * FROM  $Tabelle1  LEFT JOIN benutzer.vorname, benutzer.nachname, benutzer.telefon, benutzer.email ORDER BY datum, uhrzeit" ;
    Übrigens die letzten 4 Spaltenbezeichnungen sollen aus der 2. Tabelle (der "benutzer" Tabelle) genommen werden:

    PHP:
    [...]
        echo 
    "<th>Vorname</th>" ;
        echo 
    "<th>Nachname</th>" ;
        echo 
    "<th>Telefon</th>" ;
        echo 
    "<th>E-Mail</th>" ;
    [...]
    Danke schonmal für eure schnelle Hilfe!
     
  2. 14. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    SELECT * FROM tabelle1 JOIN tabelle2 ON tabelle1.id = tabelle2.id;

    oder falls die zu joinenden Felder (wie oben) gleich heißen:

    SELECT * FROM tabelle1 JOIN tablle2 using(id);
     
  3. 14. Mai 2012
    Zuletzt bearbeitet: 14. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    Ich habe aber für die 2. Tabelle keine Variable á la "Tabelle1" angelegt, sprich ich möchte direkt über den Tabellennamen und Feldnamen wie oben stehend joinen (also z.B. "benutzer.vorname"). Wie siehts dann aus? Komm da nicht ganz mit so wies jetzt da steht.

    *edit

    Noch was: wie kann ich bei einem INSERT die einzelnen Felder prüfen lassen, also dass sie nicht leer bleiben können und dann ne Fehlermeldung angezeigt wird?
     
  4. 14. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    Um zu Joinen brauchst du 2 Tabellen in meinem Beispiel Tablle1 und Tabelle2.


    Beispiel:
    Tabelle 1 Bestellungen:

    Spalte 1 Bestellungsid Spalte2 Kundennummer Spalte 3 gekaufte Artikel


    Tabelle 2 Kunden

    Spalte 1 Kundenummer Spalte 2 Kundenname etc.

    Bezüglich der Variablen ist es doch total egal wo und wie du Tabellennamen durch Variablen ersetzt


    Ich weiß das die Tabelle absolut nicht der Realität entspricht aber es soll nur ein Beispiel sein.
    Einen Join nutzt man um eine Relation einer Datenbank abzufragen. Hast du keine Relation in deiner Datenbank kannst du auch nicht joinen.
    In dem oberen Beispiel könnte man die Bestellungen eines Kunden anzeigen lassen.

    SELECT * FROM Kunden LEFT JOIN ON Kunden.Kundennummer = Bestellungen.Kundennummer

    Du musst immer versuchen eine Beziehung zwischen Tabellen herzustellen um diese zu joinen.


    Zu dem Insert:
    Du musst bevor du den Insert-Befehl abschickst in PHP prüfen ob die Felder deinen Kriterien entsprechen. Also ob alle Pflichfelder ausgefüllt sind und auch eine E-Mail eine E-Mail-Adresse ist. Danach oder davor solltest du deine Eingaben entschärften mit z.B. mysql_real_escape_string. Sonst ist es ein leichtes für einen Angreifer Zugriff zu deiner Datenbank zu gelangen (siehe Sqlinjections).
    So ich hoffe das ist einigermaßen verständlich
     
  5. 15. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    Mal ne Runde Off-Topic:

    PHP:
         echo  "<td align=\"middle\">" . $array [ "id" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "datum" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "uhrzeit" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "start" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "ziel" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "preis" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "vorname" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "nachname" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "telefon" ]. "</td>"
        echo 
    "<td align=\"middle\">" . $array [ "email" ]. "</td>"
        echo 
    "</tr>" ;
    Solche Dinge sollte man rein Struktur technisch in Funktionen auslagern:


    PHP:

    function  printLine ( $content ) {
        echo 
    "<td align=\"middle\">" . $content . "</td>"
    }


    PHP:
        printLine ( $array [ "id" ]); 
        
    printLine ( $array [ "datum" ]); 
        [...]
        echo 
    "</tr>" ;
    Keine Ahnung ob die Syntax so genau stimmt. Aber das Konzept sollte einleuchten. Man könnte die Funktion auch noch vom "echo" befreien und nur den String zurückgeben, dass ist aber situationspsezifisch.
     
  6. 16. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)


    Da würde ich eher zu foreach tendieren, wieso also eine Funktion schreiben?

    PHP:

     
    foreach ( $array  as  $key  => $ausgabe ) {
         echo 
    '<td align=\"middle\">' . $ausgabe . '</td>' //würde man hier per echo $key ausgeben hättest du  die Key-Namen des Arrays -> ID, Datum, Uhrzeit, Start usw
     
    }
     
  7. 16. Mai 2012
    Zuletzt bearbeitet: 16. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    Ich würde beides zusammenfassen, wenn foreach gewünscht wäre:

    PHP:

     
    foreach ( $array  as  $key  => $ausgabe ) {
        
    printLine ( $ausgabe );   //würde man hier per echo $key ausgeben hättest du  die Key-Namen des Arrays -> ID, Datum, Uhrzeit, Start usw
     
    }
    Das Problem ist aber, dass du bei foreach keinen Einfluss auf die Reihenfolge der Ausgabe hast. Und gerade hier sieht es so aus als ob man das nicht dem "Zufall" (bzw. der Datenbank bzw. der php-API) überlassen will. Ansonsten gebe ich dir recht.

    Wiederverwendbarkeit an anderen Stellen wäre ein weiterer Punkt. Sobald in dem Projekt irgendwann mal eine Zweite Tabelle benötigt wird kannst du direkt auf die Funktion (welcher man noch "align" als Parameter geben könnte) zurückgreifen.

    Es gibt so ein paar Design-Konzepte in der Programmierung die man beherrschen sollte. Unabhängig von der Sprache.
     
  8. 16. Mai 2012
    AW: MySQL Abfrage: aus 2 Tabellen eine Tabelle ausgeben (JOIN)

    Gut, natürlich hast du keinen Einfluss auf die Reihenfolge der Ausgabe, aber Einfluss auf die Reihenfolge der Eingabe in der MYSQL-Abfrage:
    PHP:
    SELECT id datum uhrzeit  [...]
    Wiederverwendbarkeit ist natürlich ein Thema, jedoch ist die Zeile mit Foreach jetzt auch kein großes Ding

    Ich habs einfach anders gelernt, welches von den beiden jetzt "besser" ist kommt sicherlich auf persönlichen Geschmack an, oder?
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.