Mastershrimp: /(PHP) mysql_fetch_row()-Problem

Heyho!

Ich habe folgenden PHP Code, der bewirken soll, dass bestimmte Einträge einer Datenbank (Kriterien: Datum, Stunde) aus der Datenbank in eine Tabelle geschrieben werden. Die Daten können auch problemlos abgefragt werden, allerdings schreibt er in die Tabelle nur den ersten Eintrag...den dafür unendlich oft. Er schließt als nicht die while-Schleife. Woran liegt das? Ich zerbreche mir nun schon seit ca. 2h den Kopf - aber ich komme nicht drauf.

Hier der Code:

<?php
  $db=mysql_connect($db_url,$db_username,$db_passw)
    or die("<div class='zentriert'><div class='error'>Fehler beim Verbindungsaufbau mit der Datenbank<br><br><a href='vplan_start.php' class='klein'>zurück zur Startseite</a></div></div>");

mysql_select_db($db_name)
    or die("<div class='zentriert'><div class='error'>Fehler beim Auswählen der Datenbank<br><br><a href='vplan_start.php' class='klein'>zurück zur Startseite</a></div></div>");

//Tabellen-Generierung
  $datum = "2004-03-01";

echo "<TABLE class='tabelle_druck' BORDER=1 ALIGN='center' CELLSPACING=5 CELLPADDING=3 WIDTH='500'>\n<TR class='druck' ALIGN='left' VALIGN='middle'>\n <TH>Stunde</TH>\n <TH>Änderung</TH>\n</TR>";

for($std=1; $std<=8; $std++)
  {
   $query2 = "SELECT * FROM " . $tab_daten . " WHERE datum = '" . $datum ."' AND stunde = '" . $std . "'";
   $eintr_std = mysql_num_rows(mysql_query($query2));

echo "<TR class='druck' ALIGN='left' VALIGN='middle'>\n <TD><span class='stunde'>" . $std . ".</span></TD>";
   echo "\n <TD class='daten'>";

if($eintr_std!="0")
    {
     while($eintraege = mysql_fetch_row(mysql_query($query2)))
      {
       echo $eintraege[2] . " " . "(" . $eintraege[3] . ") - " . $eintraege[5] . ": <i>" . $eintraege[6] . "</i>";
       echo "\n<br>\n";
      }
    }
   else
     {
      echo "<i>(kein Eintrag)</i>";
     }
    echo "\n </TD";
  }

mysql_close($db);

?>

Der Aufbau der DB-Tabelle ist folgendermaßen:
Es gibt verschiedene Einträge, die als Kennzeichnung einmal ein Feld mit einem Datum haben und einmal ein Feld mit einer Schul-Stunden-Nummer (1-8 für erste bis achte Stunde). Das Script soll nun alle Daten von einem Datum auslesen und dann eine Tabelle für die Daten der einzelnen Stunden machen.
Eigentlich ganz simpel - klappt aber irgendwie nicht :(

Weiß jemand weiter?
Danke schonmal im Vorraus!

Chapeau!

Mastershrimp

--
Kämpft für die Rettung von dem Genitiv!
  1. Hallo Mastershrimp,

    $query2 = "[...] WHERE datum = '" . $datum ."' [...]";

    warum nicht einfach "...WHERE datum = NOW()..."?

    $eintr_std = mysql_num_rows(mysql_query($query2));

    schreib das ganze lieber in zwei Zeilen:
     $rs = mysql_query($query2) or die(mysql_error());
     $eintr_std = mysql_num_rows($rs);
    Damit kannst du dann auch eine vernünftige Fehlerbehandlung einbauen.

    while($eintraege = mysql_fetch_row(mysql_query($query2)))

    das ist klar, dass du hier eine Endlosschleife produzierst - bei jedem Durchlauf wird mysql_query($query2) ausgeführt, und die Verbindungskennung an mysql_fetch_row() weitergegeben was wiederrum jedesmal den 1. Datensatz zurückgibt. Lass am besten mysql_query($query2) weg und verwende die Verbindungskennung ($rs) von oben als Parameter für mysql_fetch_row.

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. Heyho!

      warum nicht einfach "...WHERE datum = NOW()..."?

      Das konntest du nicht wissen, weil ich den Code aus dem Zusammenhang gegriffen habe. Ich will nicht immer das heutige Datum, sondern ich übergebe eins per GET-Variable an das PHP-Script. Also bringt NOW() nix ;)

      Der Rest hat allerdings einwandfrei funktioniert! Danke!

      Chapeau!

      Mastershrimp

      --
      Kämpft für die Rettung von dem Genitiv!
      1. Hallo Mastershrimp,

        warum nicht einfach "...WHERE datum = NOW()..."?
        Das konntest du nicht wissen, weil ich den Code aus dem Zusammenhang gegriffen habe. Ich will nicht immer das heutige Datum,

        achso - sag es doch gleich :-)

        sondern ich übergebe eins per GET-Variable an das PHP-Script. Also bringt NOW() nix ;)

        ich hoffe du prüfst, was du da bekommst? (nicht das da auf einmal "2004-03-01' OR '1'='1" o.ä. drinsteht)

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. Heyho!

          ich hoffe du prüfst, was du da bekommst? (nicht das da auf einmal "2004-03-01' OR '1'='1" o.ä. drinsteht)

          Wie "prüfen"? Ich wüsste nicht, wie ich 1=1 hinkriegen könnte...

          Chapeau!

          Mastershrimp

          --
          Kämpft für die Rettung von dem Genitiv!
          1. Hallo Mastershrimp,

            ich hoffe du prüfst, was du da bekommst? (nicht das da auf einmal "2004-03-01' OR '1'='1" o.ä. drinsteht)
            Wie "prüfen"?

            du musst prüfen, was du von außen bekommst (z.B. das ganze auseinanderpflücken und überprüfen, ob das wirklich ein gültiges Datum ist)

            Ich wüsste nicht, wie ich 1=1 hinkriegen könnte...

            was meinst du damit? das "2004-03-01' OR '1'='1" bewirkt u.U., dass dein WHERE-Teil immer true ergibt, und somit werden alle Datensätze ausgegeben.

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. Heyho!

              Hallo Mastershrimp,

              ich hoffe du prüfst, was du da bekommst? (nicht das da auf einmal "2004-03-01' OR '1'='1" o.ä. drinsteht)
              Wie "prüfen"?
              du musst prüfen, was du von außen bekommst (z.B. das ganze auseinanderpflücken und überprüfen, ob das wirklich ein gültiges Datum ist)

              Das prüfe ich in vorrausgehenden Dokumenten. Wenn man nicht an den GET-Variablen in der Adresszeile rumfummelt - was man an zu keiner Zeit machen kann / soll - passiert nix.

              Ich teste einfach mal, aber bis jetzt klappt alles.

              Chapeau!

              Mastershrimp

              --
              Kämpft für die Rettung von dem Genitiv!
              1. hi,

                Das prüfe ich in vorrausgehenden Dokumenten. Wenn man nicht an den GET-Variablen in der Adresszeile rumfummelt - was man an zu keiner Zeit machen kann / soll - passiert nix.

                autsch :-)

                "wenn die bank nicht überfallen wird, dann ist ihr geld dort normalerweise sicher."

                es geht weniger darum, das der besucher "versehentlich" parameter manipulieren könnte und dann falsche ergebnisse bekommt, sondern es geht um die möglichkeit absichtlicher manipluation, um das verhalten deines scriptes zu verändern, möglicherweise sogar sicherheitsrelevant.

                SQL code injection wäre ein stichwort zum suchen.

                nimm z.b. mal an, du hast einen login mit username/passwort.

                also prüfst du in deiner query ab,
                "... WHERE username='$username' AND passwort='$passwort'"

                der user kommt nur rein, wenn ein datensatz gefunden wird, bei dem username und passwort "passen".

                so, was wäre jetzt aber mit der query
                "... WHERE username='$username' AND passwort='blah' OR 1"?

                ich kenne deinen usernamen, und passwort='blah' OR 1 wäre immer true - schon bin ich als du eingeloggt, ohne überhaupt dein passwort zu kennen.

                wie erzeuge ich diesen query string? in dem ich als wert für $passwort "blah' OR 1" übergebe.
                aus deinem "... AND passwort='$passwort'" wird dann nämlich
                "... AND passwort='blah' OR 1'"
                ok, passt jetzt mit dem schliessenden ' von der syntax her noch nicht so ganz, aber dann mache ich hinter die 1 zur not noch ein kommentarzeichen, dann ist das eine gültige query ...

                deshalb gilt: vom user übermittelte daten _niemals_ ungeprüft/ungesichert in eine query übernehmen!

                gruss,
                wahsaga

                1. Heyho!

                  Das prüfe ich in vorrausgehenden Dokumenten. Wenn man nicht an den GET-Variablen in der Adresszeile rumfummelt - was man an zu keiner Zeit machen kann / soll - passiert nix.

                  autsch :-)

                  "wenn die bank nicht überfallen wird, dann ist ihr geld dort normalerweise sicher."

                  Hehe. Gut. Aber in meinem Fall kann man das praktisch vernachlässigen, da dieses Script genau 1 User haben wird. Und der hat fast noch nicht einmal genug Ahnung, um im Internet zu surfen ;)
                  Um genau zu sein: Ich schreibe mit ein paar Mitschülern eine Möglichkeit für unsere Schul-Sekretärin den Vertretungsplan online zu stellen.
                  Ich habe also in der Richtung nichts zu befürchten.
                  Aber trotzdem Danke in den kurzen Einblick in die Möglichkeiten ein Script zu umgehen ;)
                  Wo kann man so etwas lernen? Muss man einfach nur die vorhandenen Systeme (Sprachen) so gut kennen, um sie umgehen zu können, oder gibts da irgend ein "Guide", um so etwas zu lernen und dann in den eigenen Scripten so etwas zu verhindern?

                  Chapeau!

                  Mastershrimp

                  --
                  Kämpft für die Rettung von dem Genitiv!