mySQL Abfrage liefert falsches Ergebnis

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Chewie, 01.09.2005.

  1. Chewie

    Chewie Thread Starter MacUser Mitglied

    Beiträge:
    306
    Zustimmungen:
    1
    MacUser seit:
    18.03.2003
    Hi zusammen,
    Ich hab hier ein seltsames Problem mit einer sql Datenbank.

    Ich frage mit einer SELECT Abfrage eine bestimme id in einer Tabelle ab und obwohl mir mysql_num_rows sagt, dass es genau 1 Treffer dazu gibt kann ich mir die Daten dazu nicht per mysql_fetch_array ausgeben lassen.

    Kennt jemand dieses Problem?

    Hier mal der Code dazu:

    PHP:
    $SQL = "SELECT * FROM tarife WHERE id='".$id."'";
    $result = mysql_query($SQL);
    $anzahl = mysql_num_rows($result);

    $data = mysql_fetch_array($result);
    ?>
    Anzahl: <?php echo $anzahl?>
    <?php
    while($data=mysql_fetch_array($result)) {
        
    $beschreibung $data['beschreibung'];
        
    $beschreibung nl2br($beschreibung);
        
    ?>

    <p>
    <b><?=$data['name']?></b>
    Die while-Schleife geht weiter unten auch wieder zu...


    Anzahl: 1 - bekomme ich ausgegeben, aber nicht die Daten dazu!?

    PHP ist V 4.3.11 (OSX Standard) und SQL 4.0.23


    Danke und viele Grüße
    Chewie
     
    Zuletzt bearbeitet: 01.09.2005
  2. msslovi0

    msslovi0 MacUser Mitglied

    Beiträge:
    2.713
    Zustimmungen:
    115
    MacUser seit:
    20.03.2005
    Nein, das Problem ist dein php.

    Hier holst du die erste Zeile aus dem von MySQL zurückgelieferten Ergebnis und setzt den Zeiger um eines hoch (auf die zweite Zeile, die es ja aber nicht gibt).

    Und hier läufst du dein (zu diesem Zeitpunkt schon leeres) Ergebnisarray bis zum Ende durch, d.h., kein mal. Bei mehr als einer Zeile im Ergebnisarray würde dir mit deinem aktuellen Code in der Ausgabe immer die erste Zeile fehlen.

    Wenn du eh weißt, das es genau eine Zeile ist, brauchst du BTW auch keine Schleife.

    Matt
     
  3. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    Also mysql irrt selten! Das Ergebnis wird richtig sein, meist ist es eben doch der user/programmierer :)

    Du bekommst bei SELECT ja immer ein Ergebnis und sei es, daß das Ergebnis ist das es keines gibt ( NULL). Somit kann der Wert von num_rows() sehr wohl stimmen.
    Hast Du denn mit phpmyadmin oder im Terminal mal gegengeprüft ob es diese id in Deiner Tabelle wirklich gibt!?

    Matt:
    oops, den hab ich gar nicht gesehen so schnell, Recht hast :)
     
    Zuletzt bearbeitet: 01.09.2005
  4. msslovi0

    msslovi0 MacUser Mitglied

    Beiträge:
    2.713
    Zustimmungen:
    115
    MacUser seit:
    20.03.2005
    Nein, wenn das Ergebnis leer (NULL) ist, dann ist auch num_rows() false.

    Matt
     
  5. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    da warst Du jetzt schneller Matt, ich konnt es noch nicht nachprüfen. Ein deratiges Verhalten hätt mich aber eben auch nicht gewundert, da eine DB im zweifelsfall ja immer mit mind. einer Zeile antworten muß.
     
  6. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Ich hab auch noch einen:
    PHP:
    ...
    $data = mysql_fetch_array($result);
    ?>
    Anzahl: <?php echo $anzahl?>
    <?php
    while (...) {
    ...
    }
        
    ?> 
    <p> 
    <b><?=$data['name']?></b>
    ...
    führt zum selben Ergebnis wie
    PHP:
    ...
    $data mysql_fetch_array($result);
    echo 
    "Anzahl: $anzahl";
    while (...) {
    ...
    }
    echo 
    "<p><b>$data['name']</b>";
    ...
    Scheint mir irgendwie übersichtlicher und dürfte auch geringfügig schneller sein.
     
  7. msslovi0

    msslovi0 MacUser Mitglied

    Beiträge:
    2.713
    Zustimmungen:
    115
    MacUser seit:
    20.03.2005
    Nein, das führt zu einem parse error :D

    Zunächst: Die while-Schleife ist, wie schon erwähnt, unnötig, wenn man weiß, das man nur eine Ergebniszeile zurückbekommt. Und wenn innerhalb von while (...) noch einmal mysql_fetch_array() steht, haben wir das Ursprungsproblem immer noch ;-)

    Was ich damit sagen will: Entweder
    PHP:
    $data mysql_fetch_array($result);
    oder die while-Schleife ist unnötig, je nachdem, ob man einen oder mehrere Datensätze als Ergebnis erwartet.

    Weiter: Du schließt die while-Schleife in Zeile fünf wieder. Das macht aber keinen Sinn (ist im Ursprungspost auch nicht so), wenn du während dem Schleifendurchlauf die Ausgabe machen willst.

    Und zu guter Letzt der parse error:
    Entweder du schreibst
    PHP:
    echo "<p><b>{$data['name']}</b>";
    oder
    PHP:
    echo "<p><b>".$data['name']."</b>";
    Aufgrund des besseren Highlightings im Editor bevorzuge ich die zweite Variante.
    PHP:
    echo "<p><b>$data['name']</b>";
    funktioniert nicht.

    Der <p> ist BTW auch nicht zu ;-)

    Und weil wir gerade beim Performance-Management sind: SELECT * ist auch alles andere als ideal...

    Matt
     
  8. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Ja ja ;) schon gut ;).
    Nein, die Kritik ist natürlich berechtigt
    Es sollte echo "<p><b>$data[name]</b>"; heissen, dann gehts wohl wieder.

    Um den Code selbst gings mir auch gar nicht.
    Worauf ich eigentlich hinaus wollte, ist, dass man nicht ständig zwischen php und html wechseln muss, nur weil man mal ein Wort oder einen html Tag augeben möchte.

    Noch besser wäre es IMHO wenn man Code und Inhalt weitgehend voneinander trennen würde.
    Ich weiss aber ehrlich gesagt gar nicht, ob es da für PHP brauchbare Konzepte gibt.
     
  9. Chewie

    Chewie Thread Starter MacUser Mitglied

    Beiträge:
    306
    Zustimmungen:
    1
    MacUser seit:
    18.03.2003
    Oh yes!
    Da war wohl ein array zu viel im Spiel... :D

    Es ist einfach zu heiß.....

    Danke und viele Grüße
    Chewie
     
  10. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    ja, da muß man in PHP sehr diszipliniert vorgehen. Das gelingt mir selten :)
    Allerdings schreibe ich alle Seiten komplett in PHP, das ist viel lesbarer in meinen Augen. Statt permanent PHP-Tags zu haben, dann wieder pures HTML, dann heir ein Fragment und dann dort einen SQL-TEIL, mache ich alles in PHP, sprich jedes HTML-Tag wird geprinted, so manche Bereiche komplett von Methoden erzeugt. Nach meinen Erfahrungen schafft das am ehesten Ordnung ( ich habe da beizeiten ein Intranet wo ich teilweise noch auf 7 Jahre alte Skripte stoße, die ich dann erstmal auf Vordermann bringen muß...). Heute kommentiere ich jede Kleinigkeit, nur so kann man mit mehreren Programmierern über Jahre an Projekten arbeiten. Dabei ist auch wichtig sich auf einen einheitlichen Stil zu einigen, gerade bei Kommentaren und der History von Classen, Modulen und auch einzelnen Funktionen/Methoden.
     

Diese Seite empfehlen