Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] 2x mysql_fetch_array in 2 while-Schleifen, falsche Ausgabe

Einklappen

Neue Werbung 2019

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

  • [Erledigt] 2x mysql_fetch_array in 2 while-Schleifen, falsche Ausgabe

    Guten Abend und ein freundliches 'Moin' an die Community,
    ich bin sowohl bei der PHP-Programmierung als auch hier im Forum komplett neu.

    Hier hergeführt haben mich meine ersten Stolpersteine im Verständnis von PHP, hier also mein Problem, das für Fortgeschrittene wahrscheinlich recht trivial ist.

    Ich habe in einer Datenbank zwei Tabellen FAHRZEUG und SPORTWAGEN (ich habe ein simples Beispiel erstellt, nicht wundern dass das inhaltlich vllt keinen Sinn macht) und möchte Tabelle FAHRZEUG einfach komplett in einer HTML Tabelle ausgeben und die SPORTWAGEN dort hinzufügen, wo FAHRZEUG.MARKE==SPORTWAGEN.MARKE ist.



    Ich habe nun folgendes gemacht (HTML und CSS Code habe ich rausgelassen):
    PHP-Code:
    $fahrzeug "SELECT * FROM fahrzeug";
    $sportwagen "SELECT * FROM sportwagen";
    $db_fahrzeug mysql_query$fahrzeug );
    $db_sportwagen mysql_query$sportwagen );

    while (
    $zeile_fahrzeug mysql_fetch_array$db_fahrzeugMYSQL_ASSOC)) {
    echo 
    $zeile['marke']; 
    while (
    $zeile_sportwagen mysql_fetch_array$db_sportwagenMYSQL_ASSOC))
    {
    if (
    $zeile_sportwagen['marke']==$zeile_fahrzeug['marke'] echo $zeile_sportwagen['modell'];
    }

    Im Anhang sind beide Tabellen, das erhaltene und das gewünschte Ergebnis aufgelistet. Dort sieht man, dass das innere mysql_fetch_array nur in der ersten Iteration funktioniert, danach nicht mehr. Und ich habe keine Ahnung warum und steh auf dem Schlauch.

    Wenn es einen viel schöneren Weg gibt, wie ich das lösen kann (denn bei großen Datenmengen sind while-Schleifen mit Datenbankzugriffen innerhalb von while-Schleifen mit Datenbankzugriffen sicher nicht sehr performant), bin ich auch hier für Hilfe sehr dankbar

    Gruß und danke,
    dewell

  • #2
    Für so etwas benutzt man einen JOIN. Übrigens ist es falsch, in der Tabelle Modell die Marke als Fremdschlüssel zu verwenden und nicht die ID. Einen Primärschlüssel (unterstrichen) stellt sie auch nicht dar.

    Kommentar


    • #3
      Okay, ich muss mir wohl nochmal die SQL Joins anschauen. Der Strich unter MODELL ist einfach nur falsch, sollte nicht sein.

      Ich habe bisher LEFT OUTER JOIN verwendet, um eine Spalte aus einer zweiten Tabelle an die erste Tabelle anzufügen. Aber würde ich z.b.
      PHP-Code:
      LEFT OUTER JOIN sportwagen ON fahrzeug.modell=sportwagen.modell 
      machen, hätte ich dann ja in der Tabelle einfach nur mehrere Reihen mit Mercedes in einer Spalte.

      Ich denk mal drauf rum, ist eine Menge so als Quereinsteiger

      Kommentar


      • #4
        Wenn du nur Fahrzeuge/Sportwagen haben willst, die in beiden Tabellen (links und rechts) vorhanden sind ist ein EFT JOIN dein Fall. Wenn ein Eintrag in Fahrzeuge (links) nicht unbedingt einen in Sportwagen (rechts) voraussetzt wäre es LEFT INNER JOIN und im umgekehrten Fall LEFT OUTER JOIN.

        Kommentar


        • #5
          Mh, um das in der Grafik gewünschte Ergebnis zu haben bringt mir ein JOIN also nicht allzuviel. Ich hätte durch den LEFT JOIN ja eine große Tabelle in der die Marken mehrfach vorkommen, nämlich genauso oft wie es halt einen Wagen dazu gibt.

          Kommentar


          • #6
            Ja. Das ist vollkommen normal in der Arbeit mit Datenbanken. Ich schlage vor, Du arbeitest erstmal ein Tutorial zu diesem Thema durch.

            Lerne Grundlagen | Quellensammlung

            Kommentar


            • #7
              Danke für den Link zum "Lerne Grundlagen"-Thread.

              Mir ist allerdings klar, dass das angesprochene Verhalten normal für Datenbanken ist. Nur sehe ich nicht, wie es mir bei meinem Problem weiter hilft, aus zwei unterschiedlichen Datenbanktabellen das gewünschte Ergebnis zu bekommen.

              Wenn ich den JOIN anwende, kann ich mir MARKE und MODELL ausgeben lassen und erhalte dann in meiner HTML-Tabelle sowas wie

              Mercedes | SLS AMG | Mercedes | C63 AMG | Audi | R8 | Audi | R12

              ich möchte aber:

              Mercedes | SLS AMG | C63 AMG | Audi | R8 | R12

              Gibt es eine Möglichkeit beim Durchlaufen einer Variable mit Datenbankinhalten mit mysql_fetch_assoc() in einer Zeile auf Inhalte der vorherigen und nachfolgenden Zeile zuzugreifen? Ich könnte dann prüfen ob die vorherige Zeile schon die gleiche Marke gewesen ist ...

              PS: Am rauhen Ton hier merke ich, dass mein wahrscheinlich sehr triviales Problem einige erfahrene User eher verärgert. Ich möchte euch versichern, dass ich parallel zu meinem kleinen Projekt weiter an meinen allgemeinen Kenntnissen feile und nicht aus Faulheit einfach andere meinen Code schreiben lassen möchte.

              Kommentar


              • #8
                Zitat von dewell Beitrag anzeigen
                PS: Am rauhen Ton hier merke ich, dass mein wahrscheinlich sehr triviales Problem einige erfahrene User eher verärgert. Ich möchte euch versichern, dass ich parallel zu meinem kleinen Projekt weiter an meinen allgemeinen Kenntnissen feile und nicht aus Faulheit einfach andere meinen Code schreiben lassen möchte.
                Nein das liegt daran dass es in einem forum immer solche leute gibt die jeden neuling kritisieren müssen.
                leider kann ich sonst nicht viel zum Thema beitragen ich hätte es vermutlich mit dem normalen SELECT und sonst garnichts also kein JOIN oder so gemacht.

                Kommentar


                • #9
                  Die Ursprungsfrage ist ja eigentlich auch: Warum funktioniert es nicht, zwei Datenbanktabellen in jeweils eine Variable zu schreiben und beide verschachtelt auszulesen?
                  PHP-Code:
                  while ($zeile1 mysql_fetch_array$variable1MYSQL_ASSOC)) { 
                  while (
                  $zeile2 mysql_fetch_array$variable2MYSQL_ASSOC)) { 
                  .... };
                  }; 

                  Kommentar


                  • #10
                    Diese Frage beantwortet dir das PHP Handbuch.
                    Gibt ein Array zurück das der gelesenen Zeile entspricht und bewegt den internen Datenzeiger nach vorwärts.
                    Wenn du jeden Datensatz einmal aus dem Ergebnis geholt hast (und den Zeiger bis zum Ende bewegt hast), kannst du keine weiteren Ergebnisse rausholen.

                    VG

                    Kommentar


                    • #11
                      Nein das liegt daran dass es in einem forum immer solche leute gibt die jeden neuling kritisieren müssen.
                      leider kann ich sonst nicht viel zum Thema beitragen ich hätte es vermutlich mit dem normalen SELECT und sonst garnichts also kein JOIN oder so gemacht.
                      Ja super, keine AHnung haben, aber anderen ans Bein pissen. Echt großartig.
                      Wenn ich den JOIN anwende, kann ich mir MARKE und MODELL ausgeben lassen und erhalte dann in meiner HTML-Tabelle sowas wie

                      Mercedes | SLS AMG | Mercedes | C63 AMG | Audi | R8 | Audi | R12

                      ich möchte aber:

                      Mercedes | SLS AMG | C63 AMG | Audi | R8 | R12
                      1. ist das für das Problem nebensächlich und 2. wird hier alle Nase lang geschrieben, dass SELECT * halt nicht das Gelbe vom Ei ist.

                      Kommentar


                      • #12
                        Zitat von BR2012 Beitrag anzeigen
                        Diese Frage beantwortet dir das PHP Handbuch.

                        Wenn du jeden Datensatz einmal aus dem Ergebnis geholt hast (und den Zeiger bis zum Ende bewegt hast), kannst du keine weiteren Ergebnisse rausholen.

                        VG
                        Mh, das heißt, dass die in der While-Schleife angelegte $variable2 nicht "lokal" nur für die Schleife gilt sondern auch in einem neuen Aufruf der Schleife wiederverwendet wird und deshalb der Zeiger ganz am Ende des arrays steht?

                        Wenn ja, könnte ich am Ende jeder Iteration einfach unset($variable2) machen oder? Teste ich mal morgen.

                        Kommentar


                        • #13
                          So ähnlich. Mit unset() würdest du ja das Ergebnis komplett löschen (bzw. genau genommen die Ressource, die sich dahinter verbirgt, freigeben).

                          http://www.php.net/manual/de/functio...-data-seek.php

                          Hierbei sei noch erwähnt, dass die mysql_*-Funktionen als veraltet ("deprecated") eingestuft sind und stattdessen empfohlen wird, auf mysqli bzw. PDO umzusteigen.

                          VG

                          Kommentar


                          • #14
                            oh man ... klasse, vielen Dank. Die mysql_data_seek-Funktion hätte ich wohl von allein nie gefunden Damit funktioniert es schonmal und geschicktere Lösungen werden mir beim PHP-Lernen in Zukunft sicher einfallen

                            Ich werde auch mal schauen was es mit mysqli und PDO auf sich hat.

                            Kommentar


                            • #15
                              Die Lösung über while bleibt unsinnig. Ein JOIN ist genau für Kombinationen von Tabellen gedacht. Was Du tust ist wieder und wieder Daten abzufragen, um die Hälfte nach einem Vergleich wegzuschmeißen.

                              Kommentar

                              Lädt...
                              X