mySQL Abfrage liefert falsches Ergebnis

  1. Chewie

    Chewie Thread StarterMacUser Mitglied

    Mitglied seit:
    18.03.2003
    Beiträge:
    303
    Zustimmungen:
    1
    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
     
    Chewie, 01.09.2005
  2. msslovi0

    msslovi0MacUser Mitglied

    Mitglied seit:
    20.03.2005
    Beiträge:
    2.714
    Zustimmungen:
    115
    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
     
    msslovi0, 01.09.2005
  3. wegus

    wegusMacUser Mitglied

    Mitglied seit:
    13.09.2004
    Beiträge:
    14.982
    Zustimmungen:
    1.545
    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 :)
     
    wegus, 01.09.2005
  4. msslovi0

    msslovi0MacUser Mitglied

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

    Matt
     
    msslovi0, 01.09.2005
  5. wegus

    wegusMacUser Mitglied

    Mitglied seit:
    13.09.2004
    Beiträge:
    14.982
    Zustimmungen:
    1.545
    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ß.
     
    wegus, 01.09.2005
  6. maceis

    maceisMacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    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.
     
    maceis, 01.09.2005
  7. msslovi0

    msslovi0MacUser Mitglied

    Mitglied seit:
    20.03.2005
    Beiträge:
    2.714
    Zustimmungen:
    115
    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
     
    msslovi0, 01.09.2005
  8. maceis

    maceisMacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    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.
     
    maceis, 01.09.2005
  9. Chewie

    Chewie Thread StarterMacUser Mitglied

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

    Es ist einfach zu heiß.....

    Danke und viele Grüße
    Chewie
     
    Chewie, 01.09.2005
  10. wegus

    wegusMacUser Mitglied

    Mitglied seit:
    13.09.2004
    Beiträge:
    14.982
    Zustimmungen:
    1.545
    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.
     
    wegus, 01.09.2005
Die Seite wird geladen...
Ähnliche Themen - mySQL Abfrage liefert
  1. xenon96
    Antworten:
    2
    Aufrufe:
    582
    xenon96
    27.06.2015
  2. max@hismac
    Antworten:
    2
    Aufrufe:
    1.611
  3. max@hismac
    Antworten:
    0
    Aufrufe:
    2.356
    max@hismac
    09.05.2013
  4. max@hismac
    Antworten:
    2
    Aufrufe:
    1.854
    nightcoding
    02.06.2012
  5. m0mo
    Antworten:
    9
    Aufrufe:
    1.014
    ThaHammer
    21.12.2005