Ankündigung

Einklappen
Keine Ankündigung bisher.

Zwei foreach Schleifen verschachtelt

Einklappen

Neue Werbung 2019

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

  • Zwei foreach Schleifen verschachtelt

    Hallo Leute, ich bin neu hier und wie so einige natürlich mit einem Problem, dass ich selber nicht lösen kann. Ich habe für unsere Firma ein Ticketsystem eingeführt. Jedem Ticketeintrag kann ein Flag gesetzt werden, wenn dieses berechenbar ist. Soweit so gut. Nun brauche ich eine Übersicht, pro Kunde mit allen Tickets mit dem Flag berechenbar. Meine Datenbank hat für diese Aufgabe zwei Tabellen.

    Tabelle: Kunden
    kid Name Strasse PLZ Ort
    1 Kunde 1 Musterstr. 1 12345 Entenhausen
    2 Kunde 2 Bahnhof 1 67890 Stadt
    Tabelle: Tickets
    tid Vorgang Datum Berechenbar Dauer aid
    1 Problem 1 2019-01-02 1 10 1
    2 Problem 2 2019-01-03 0 20 1
    3 Problem 3 2019-01-03 1 30 2
    4 Problem 4 2019-01-04 1 40 2
    Folgendes Ergebnis hätte ich gerne:
    Kunde 1
    1 Problem 1 10 2019-01-02
    Kunde 2
    3 Problem 3 30 2019-01-03
    4 Problem 4 40 2019-01-04
    Mein Ansatz sehr ihr hier:
    PHP-Code:
    $kunde "SELECT DISTINCT k.kid,k.name,k.berechenbar,t.aid
    FROM tickets t
    LEFT JOIN kunden k ON k.kid = t.aid
    WHERE t.berechenbar=1
    ORDER BY k.kid"
    ;

    $ticket "SELECT t.datum,t.vorgang,t.dauer,t.aid,k.kid
    FROM tickets t
    LEFT JOIN kunden k ON k.kid = t.aid
    WHERE t.berechenbar=1"
    ;


    echo 
    "<table>";
        foreach (
    $pdo->query($kunde) as $zeile) {
        echo 
    "<tr>";
            echo 
    "<td>";

                echo 
    "<table>";
                    echo 
    "<tr>";
                        echo 
    "<td colspan='3'><strong>"$zeile['name'] ."</strong></td>";
                    echo 
    "</tr>";
                    foreach (
    $pdo->query($ticket) as $ticketzeile) {
                    echo 
    "<tr>";
                        echo 
    "<td valign='top'>"$ticketzeile['datum'] ."</td>";
                        echo 
    "<td valign='top'>"$ticketzeile['vorgang'] ."</td>";
                        echo 
    "<td valign='top'>"$ticketzeile['dauer'] ."</td>";
                    echo 
    "</tr>";
                    }
                echo 
    "</table>";

            echo 
    "</td>";
        echo 
    "</tr>";
        }
    echo 
    "</table>"
    Das Ergebnis passt fast. Allerdings bekomme ich nun bei Kunde 1 und Kunde 2 jeweils alle berechenbaren Tickets von allen Kunden. Wo steckt mein Fehler?
    Für eure Gedanken wäre ich sehr dankbar.

  • #2
    Mich wundert eher, dass da überhaupt was rauskommt, da fk-kid keine gültige Spaltenbezeichnung ist (sondern eine Subtraktion).

    Kommentar


    • #3
      Du brauchst kein Join auf die Tabelle Kunden, wenn du nur die Kunden-Id ausgibst.

      Für deine Ausgabe brauchst du Gruppenwechel.

      Dann border='0' etc. gehört zu CSS. und verschachtelte Ausgabetabellen brauchst es hier auch nicht. Nutze den Wc3 Validator für dein HTML.

      Schau dir auch mal das EVA-Prinzip an, dann kannst du dir die vielen echos sparen.

      Kommentar


      • #4
        Zitat von Dormilich Beitrag anzeigen
        Mich wundert eher, dass da überhaupt was rauskommt, da fk-kid keine gültige Spaltenbezeichnung ist (sondern eine Subtraktion).
        Hallo Dormilich,

        die Spalte heißt bei mir nicht FK-KID. Das sollte eher der Veranschaulichung dienen, damit hier im Forum sofort erkannt wird, dass es sich um einen Foreign Key handelt.

        Kommentar


        • #5
          Zitat von columbus Beitrag anzeigen
          die Spalte heißt bei mir nicht FK-KID. Das sollte eher der Veranschaulichung dienen, damit hier im Forum sofort erkannt wird, dass es sich um einen Foreign Key handelt.
          Bitte keinen kaputten Fantasiecode posten. Das trägt nicht der Problemsuche bei, macht es im Gegenteil sogar schwerer.

          Desweiteren Tabellenstruktur und Testdaten ausschließlich als SQL-Code posten. MIt HTML-Tabellen kann ja niemand was anfangen.

          Kommentar


          • #6
            Zitat von hellbringer Beitrag anzeigen

            Bitte keinen kaputten Fantasiecode posten. Das trägt nicht der Problemsuche bei, macht es im Gegenteil sogar schwerer.

            Desweiteren Tabellenstruktur und Testdaten ausschließlich als SQL-Code posten. MIt HTML-Tabellen kann ja niemand was anfangen.
            Danke für den Hinweis. Werde ich künftig beherzigen. Ich habe meinen Einstiegspost angepasst und die Spalten tragen nun die originalen Namen.

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              Für deine Ausgabe brauchst du Gruppenwechel.
              Mit dem Modus PDO::FETCH_GROUP laesst sich das auch recht einfach bewerkstelligen.

              Kommentar


              • #8
                Ja sicherlich, aber - er muss vorab die Grundzüge verstanden haben, sonst ist das eine Nummer zu hoch für ihn.

                Kommentar


                • #9
                  Vielen Dank protestix. Der Gruppenwechsel war genau das, was ich gebraucht habe. Habe mich in das Thema eingelesen und das war genau meine Lösung.

                  PHP-Code:
                  $tickets "SELECT k.name,t.vorgang,t.berechenbar   
                  FROM tickets t    
                  LEFT JOIN kunden k ON t.aid = k.kid    
                  WHERE t.berechenbar = '1'    
                  ORDER BY k.name"
                  ;

                  $kunde NULL;  

                  foreach (
                  $pdo->query($tickets) as $ticket) {      

                  if (
                  $kunde != $ticket['name']) {          
                  $kunde $ticket['name'];          
                  printf('<h1>%s</h1>'$kunde);    
                  }      

                  printf('<p>%s</p>'$ticket['vorgang']);

                  Kommentar


                  • #10
                    Oder etwas kürzer mit dem Tipp von Dormilich

                    PHP-Code:
                    $data $pdo->query($tickets)->fetchAll(PDO::FETCH_GROUP);

                    foreach(
                    $data as $kunde => $detail) {
                      echo 
                    "<h1>$kunde</h1>" implode('<br>'array_column($detail'vorgang'));  

                    sorry, shift-taste kaputt

                    Kommentar

                    Lädt...
                    X