Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Abfrage in PHP mit Join?

Einklappen

Neue Werbung 2019

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

  • SQL Abfrage in PHP mit Join?

    Hallo

    Aktuell lautet mein Code wie folgt. Alles schön und gut und funktioniert auch gut.
    Bekomme jetzt aus Ausgabe bei home_verein die ID 1 und bei gast_verein die ID 2 usw.

    Jetzt habe ich folgendes Problem:
    In der Tabelle "ws_verein" gibt es die Spalten id und name. Er soll mir jetzt anhand der IDs statt den Nummer die Namen der Vereine in der anderen Tabelle ausgeben.
    Ich steh irgendwie am Schlauch, komme mit den JOINs da nicht klar.

    Bitte um Hilfe



    PHP-Code:
    <?php

                $sql 
    "SELECT home_verein, gast_verein FROM ws_spiel WHERE spieltag = " $_GET['spieltag'] . " ORDER BY spieltag ASC";
            foreach (
    $pdo->query($sql) as $row) {
             
    ?>
              <tr>
               <td align="center" bgcolor='#ececec'>
              <?php
              
    echo $row['home_verein'];
              
    ?>
              </td>
              <td align="center" bgcolor='#ececec'>
              <?php
              
    echo "- : -";
              
    ?>
              </td>
              <td align="center" bgcolor='#ececec'>
              <?php
              
    echo $row['gast_verein'];
              
    ?>

  • #2
    Naja, du muss den JOIN in der Query schon auch machen. Hier ein schönes Beispiel für so einen Standard-Fall: https://php-de.github.io/jumpto/grup...h/#beispiel-1b

    Du hast übrigens eine riesige SQL-Injection (Sicherheits) Lücke und behandelst den Ausgabekontext zu HTML nicht korrekt. Da droht die nächste Lücke (XSS, etc.)

    Daher nutze Prepared Statments (zB: https://php-de.github.io/jumpto/pdo/...red-statements ) und htmlspecialchars()
    The string "()()" is not palindrom but the String "())(" is.

    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


    • #3
      Das wäre dann bei mir

      PHP-Code:
      $sql "SELECT s.home_verein AS home_verein, s.gast_verein AS gast_verein FROM ws_spiel s WHERE spieltag = " $_GET['spieltag'] . " INNER JOIN ws_verein v ON s.home_verein = v.name AND s.gast_verein = v.name"
      Da bekomme ich allerdings keine Ausgabe mit

      PHP-Code:
      echo $row['home']; 

      Kommentar


      • #4
        Ja dann... wurde nichts gefunden, oder die Query ist falsch.. find es heraus. -> https://php-de.github.io/jumpto/sql/

        Ev. ein heisser Tipp.. Datumsformat. Schau in den Artikel und lass dir mal die geparste Query ausgeben, diese auf der DB laufen lassen und dann wirst du schon viel mehr wissen.
        The string "()()" is not palindrom but the String "())(" is.

        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


        • #5
          Bekomm keine Fehlerausgabe. Also liegt es am QUERY nur wieso? In meinen Augen passt das ganze nun eigentlich

          Kommentar


          • #6
            Dann gibt es mit der Bedinung vemutlich keinen Satz. Zeig bitte mal die fertig geparste Query. Und welchen Datentyp hast du im DB-Feld Spieltag?


            In meinen Augen passt das ganze nun eigentlich
            Floskeln.. Warum bist du dann hier?
            The string "()()" is not palindrom but the String "())(" is.

            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


            • #7
              Zitat von Sp1n Beitrag anzeigen
              Das wäre dann bei mir

              PHP-Code:
              $sql "SELECT s.home_verein AS home_verein, s.gast_verein AS gast_verein FROM ws_spiel s WHERE spieltag = " $_GET['spieltag'] . " INNER JOIN ws_verein v ON s.home_verein = v.name AND s.gast_verein = v.name"
              Da bekomme ich allerdings keine Ausgabe mit

              PHP-Code:
              echo $row['home']; 
              Ja klar, weil JOINs immer vor WHERE Bedingungen kommen müssen. Alles andere ist ein SQL Syntax Fehler.

              Ein SQL Query baut sich immer wie folgt auf:

              PHP-Code:
              SELECT spalte1spalte2
              FROM Tabelle1
              INNER JOIN Tabelle2 ON Tabelle1
              .id Tabelle2.tabelle1_id
              WHERE spalte1 
              'Bedingung'
              Generelles "Bad Style": SELECT *, $_REQUEST Variablen ohne Input Filterung direkt an einen String anhängen (= SQL Injection).

              Prepared Statements verhindern zwar schon viel, können aber zum Beispiel auch keine Regulären Ausdrücke verhindern. Die musst Du mittels Input Escaping entfernen aus dem bindValue.

              Außerdem verwendest Du PDO falsch. Mit PDO::query führst Du jedes mal den selben Query erneut aus. Was Du willst, ist den Cursor auf das nächste Ergebnis des Queries bewegen. Das geht hiermit: http://php.net/manual/de/pdostatemen...p#example-1015

              Du kannst aber auch alle Ergebnisse auf einmal holen mit PDOStatement::fetchAll(). Das ist aber nur bei kleineren Datenmengen zu empfehlen. Bei großen Datenmengen empfiehlt sich das obere Beispiel. Beim oberen Beispiel wird immer nur ein Datensatz eingelesen. Mit fetchAll liest Du alles auf einmal ein, das heißt du verbrauchst wesentlich mehr Speicher Ressourcen.

              Kommentar


              • #8
                Zitat von hausl Beitrag anzeigen
                Daher nutze Prepared Statments (zB: https://php-de.github.io/jumpto/pdo/...red-statements ) und htmlspecialchars()
                Ich frage mich für was ich das verlinke, wenn es eh nicht angeschaut wird. Sp1n Damit hättest du es a) korekt und b) ohne SQL-Injection Lücke.
                The string "()()" is not palindrom but the String "())(" is.

                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


                • #9
                  Vielen Dank schon mal für die Hilfe, das mit der WHERE Bedingung nach dem JOIN hat mir mal geholfen.

                  PHP-Code:
                  SELECT s.home_verein AS homes.gast_verein AS gast FROM ws_spiel s INNER JOIN ws_verein v ON s.home_verein v.name AND s.gast_verein v.name WHERE s.spieltag 12 
                  Habe das nun durchlaufen lassen in der Datenbank und bekomm nichts zurück, also ist irgendwas noch in der Abfrage falsch.

                  hausl Spieltag ist ein int fehlt und deinen Link habe ich natürlich gesehen. Werd ich auch nachholen sobald meine Abfrage am Laufen ist

                  Kommentar


                  • #10
                    Mal formatiert und lesbarer gemacht..

                    Code:
                    SELECT
                        s.home_verein AS home,
                        s.gast_verein AS gast
                    
                    FROM
                        ws_spiel s
                    
                    INNER JOIN
                        ws_verein v ON s.home_verein = v.name AND s.gast_verein = v.name
                    
                    WHERE s.spieltag = 12
                    Ich behaupte deine JOIN Klausel ist falsch. Eigenltich JOINt man über die ID. Ist deine DB korrekt normalisiert? Scheint mir nicht so. Schau mal da: http://www.peterkropff.de/site/mysql...isierte_db.htm

                    Wie sehen denn deine Tabellen aus, hast du da mal ein Beispiel?
                    The string "()()" is not palindrom but the String "())(" is.

                    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
                      Mal formatiert und lesbarer gemacht..



                      Ich behaupte deine JOIN Klausel ist falsch. Eigenltich JOINt man über die ID. Ist deine DB korrekt normalisiert? Scheint mir nicht so.

                      Die Datenbank stammt von nem Fussballmanager script und ist fast 10 Jahre alt, also bezweifel ich das.

                      Kommentar


                      • #12
                        Dann musst du korrekt normalisieren. Ohne die DB zu sehen kann ich dir aber logischerweise nicht sagen welche Spalten du verwenden sollst. Normal JOINT man die id mit der fremd_id der anderen Tabelle. In dem verlinken Beispiel oben https://php-de.github.io/jumpto/grup...h/#beispiel-1b mit Modellen Marke kannst du das gut sehen.
                        The string "()()" is not palindrom but the String "())(" is.

                        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


                        • #13
                          Ich bin ein Stück weiter und bekomm jetzt die beiden Namen schon mal ausgegeben. Ich hatte nen Denkansatz und bin es falsch angegangen

                          PHP-Code:
                          SELECT v.name FROM ws_verein v INNER JOIN ws_spiel s ON s.home_verein v.id WHERE s.spieltag 12 

                          Kommentar


                          • #14
                            Code:
                            INNER JOIN ws_spiel s ON s.home_verein = v.id 
                            Jo das schaut gut aus.
                            The string "()()" is not palindrom but the String "())(" is.

                            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


                            • #15
                              Zitat von hausl Beitrag anzeigen

                              Jo das schaut gut aus.
                              Nur jetzt hab ich das Problem das folgendes natürlich net funktioniert:

                              PHP-Code:
                              SELECT v.name FROM ws_verein v INNER JOIN ws_spiel s ON s.home_verein v.id AND s.gast_verein v.id WHERE s.spieltag 12 
                              Kann doch nicht zweil = v.id nehmen oder lieg ich da falsch? Weil wenn ich es mache, natürlich keine Ausgabe

                              Kommentar

                              Lädt...
                              X