MySQL ID's begrenzt auslesen

g-zus

Erfahrenes Mitglied
Hi Leute!

So, hab jetzt ein extrem verwirrendes Zeugs zussamengeschnippselt und geproggt und hab damit versucht aus einer Tabelle die letzten zwanzig Einträge auszulesen und diese dann zu posten.

mein problem:

Anstatt, dass er von hinten gesehen die letzten Zeilen (letzten 20 ID's!) ausliest und ausgibt.
Gibt er immer nur die zuletzt gespeicherte ID aus...und das unendlich oft! Sieht nicht grad toll au8s...lol

So, habt ihr nun also ein Script parat oder könnt ihr meins hier verbessern?
(ich habs nur asuschnittweise gepostet!)



PHP:
<?

for( $i=0;$i=20;$i++) {

    $aktuelle_id = $max_id-$i;

    @mysql_connect ("$servername", "$dbusername", "$dbpassword") OR die ("Verbindung zum MySQL-Server fehlgeschlagen");
    @mysql_select_db ("$dbname") OR die("Verbindung zur Datenbank fehlgeschlagen");

    $result = mysql_query("SELECT * FROM news WHERE ID $aktuelle_id");
    $sql = mysql_query("SELECT MAX(id) AS newid FROM news");

    if ($row1 = mysql_fetch_array($sql)) {
    do{
      $max_id = $row1[newid];
    }
    while($row1 = mysql_fetch_array($sql));
    } else {
    }
 
    if ($row = mysql_fetch_array($result)) {
    do{
      $id = $row[id];
      $date = date("d.m.y", $row[date]);
      $nick = $row[nick];
      $title = $row[title];
      $comment = $row[comment];
      $comment = enable_url(enable_tags(strip_tags($comment)));
      $comment = wordwrap($comment, 10, "\n", 1);
      $comment1 = $row[comment1];
      $comment1 = enable_url(enable_tags(strip_tags($comment1)));
      $comment1 = wordwrap($comment1, 10, "\n", 1);
      $comment2 = $row[comment2];
      $comment2 = enable_url(enable_tags(strip_tags($comment2)));
      $comment2 = wordwrap($comment2, 10, "\n", 1);
      replace_text_smiley();

    } 
    while($row = mysql_fetch_array($result));

        echo "BLABLABLA"; //Hier wird alles ausgegeben!

        } 
    else {

    echo "BLABLABLA was anderes..."; //ich glaube hier kommt
        //das hin, das dastehen soll, wenn die tabelle
        //noch leer is; war beim ursprünglichen script so (!!!)

    }
    @mysql_close($servername);

}

?>


Ich weiß, dass einiges unnütz is oder so, aber ich hab von PHP kaum Ahnung und hab mir das alles von Foren oder so zusammengeschnipselt.

Könnt ihr hier den HAUPTFEHLER finden, warum er unendlich oft die letzte Zeile (da, wo die ID halt am größten ist!) ausspuckt und nicht die letzten 20 Zeilen?


Kann es vielleicht daran liegen, dass ich keine Schleife drin habe, die abfragt, ob überhaupt schon 20 zeilen in der Tabelle vorhanden sind und es daher zu einem Fehler kommt?

Nachtrag:
~~~~~~~~

K, ich weiß jetzt wie ich es schaffe, dass ich die Teile absteigend anordne.

PHP:
SELECT * FROM news ORDER BY id DESC

Aber ich glaube nicht, dass das was zur sache tut!
 
Was du da programmiert hast, ist eine klassische Endlosschleife:
PHP:
for( $i=0;$i=20;$i++) {
...
}
Dieser Befehl führt dazu, dass die Schleife so lange durchlaufen wird, bis der Ausdruck $i=20 falsch ist. Da $i=20 aber eine Zuweisung ist, und diese hier AFAIK immer 20 zurückgeben müsste, wird das ganze zu einer Endlosschleife. Das ist wohl der Hauptfehler. Wobei man diese Schleife gar nicht braucht. Das ganze lässt sich auch schön mit der LIMIT-Anweisung von mySQL realisieren:

PHP:
<?php
$mysql_id = mysql_connect ($servername, $dbusername, $dbpassword) OR die ("Verbindung zum MySQL-Server fehlgeschlagen");
mysql_select_db ($dbname) OR die("Verbindung zur Datenbank fehlgeschlagen");

$result = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT 0, 20");

if ($num=mysql_affected_rows($result))
{
   for ($i=0;$i<$num;$i++)
   {
      $row = mysql_fetch_array($result);
      $id = $row[id];
      $date = date("d.m.y", $row[date]);
      $nick = $row[nick];
      $title = $row[title];
      $comment = $row[comment];
      $comment = enable_url(enable_tags(strip_tags($comment)));
      $comment = wordwrap($comment, 10, "\n", 1);
      $comment1 = $row[comment1];
      $comment1 = enable_url(enable_tags(strip_tags($comment1)));
      $comment1 = wordwrap($comment1, 10, "\n", 1);
      $comment2 = $row[comment2];
      $comment2 = enable_url(enable_tags(strip_tags($comment2)));
      $comment2 = wordwrap($comment2, 10, "\n", 1);
      replace_text_smiley();

      // Hier kommt die Ausgabe hin!
   }
}
else
{
   // Hier die Ausgabe des 'kein Eintrag'-Textes einfügen! 
}

mysql_close($mysql_id);
?>

Ich hoffe das hilft ;)
 
hmm...zuerst mal THX!
ich habs jetzt eingebaut und glücklicherweise zeigt er jetzt zumindest mal keine Endlosschleife mehr an.

Aber dafür zeigt er bei der zeile

PHP:
if ($num=mysql_affected_rows($result))

Die Fehlermeldung:

PHP:
Warning: Supplied resource is not a valid MySQL-Link resource in /home/sicbase/news_eingabe.php on line 147
 
so, es funzt jetzt!
ich habe einfach statt

PHP:
if ($num=mysql_affected_rows($result))

das hier genommen

PHP:
if ($num=mysql_num_rows ($result))

Und jetz funzt es wunderbar!

THX @ reima und workaholic!
 
Zurück