1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

PHP und MySQL - Neuere Beiträge aus Datenbank zeigen

Dieses Thema im Forum "PHP" wurde erstellt von d3mueller, 5. Mai 2012.

  1. d3mueller

    d3mueller Grünschnabel

    Hi, ich lerne gerade PHP und MySQL mit dem Buch "PHP und MySQL für Kids"^^
    Is n gutes Buch, aber ich habe ein paar Fragen zu einem Teil:

    Also, ich bin im Kapitel, in dem man ein einfaches CMS bastelt. Bei mir funktioniert es auch soweit. Hier mal der Code:
    PHP:
    1.  
    2. <?php
    3. include ("edit/zugriff.inc.php");
    4. ?>
    5. <!DOCTYPE HTML>
    6. <html>
    7. <head>
    8. <meta charset="utf-8">
    9. <title>Unser CMS</title>
    10. <style type="text/css">
    11. body {
    12.     background: gray;
    13. }
    14. #wrapper {
    15.     width: 900px;
    16.     border: solid 1px;
    17.     background-color: white;
    18.     padding: 10px;
    19. }
    20. h1 {
    21.     background: gray;
    22.     color: white;
    23. }
    24. </style>
    25. </head>
    26.  
    27. <body>
    28. <div id="wrapper">
    29. <h1>Unser Webtagebuch</h1>
    30. <div>[ <a href="index.php">Home</a> ]</div>
    31.  
    32. <?php
    33. $start = 0; //Startwert setzen (0 = 1. Zeile)
    34. $step = 2; // Wie viele Einträge gleichzeitig?
    35. $muster = "/^[0-9]+$/"; //reg. Ausdruck für Zahlen
    36. //Startwert verändern
    37. if (isset($_GET['start'])) {
    38.     if (preg_match($muster, $_GET['start']) == 0) {
    39.         $start = 0; //Bei Manipulation Rückfall auf 0
    40.     } else {
    41.         $start = $_GET['start'];
    42.     }
    43. }
    44. $sql1 = "SELECT * FROM cms";
    45. $sql2 = "SELECT * FROM cms ORDER BY id DESC LIMIT $start, $step";
    46. $result1 = mysql_query($sql1);
    47. $zeilen = mysql_num_rows($result1);
    48. $result2 = mysql_query($sql2);
    49. echo "<p>Anzahl der Eintr&auml;ge: $zeilen</p>\n";
    50.  
    51. //while-Schleife Anfang
    52. while ($row = @mysql_fetch_assoc($result2)) {
    53.     $Eintrag = nl2br($row['Eintrag']);
    54.     //Einträge anzeigen
    55.       echo "<h3>$row[Headline]</h3>\n" . "<p>$Eintrag</p>" . "<div><small>eingetragen von <b>$row[Name]</b> " . "am <strong>$row[Datum]</strong></small></div><br><br>\n";
    56. } //while-Ende
    57.  
    58. //Link zu älteren Einträgen einblenden
    59. $start = $start + $step;
    60. echo "<p>";
    61. if ($start < $zeilen) { // if-Anfang
    62.     echo "[ <a href=\"index.php?start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]";
    63. }
    64. echo "[ <a href='#wrapper'>nach oben</a> ] </p>\n";
    65. ?>
    66. </body>
    67. </html>
    68.  
    Also 1.:
    Kann mir einer das mit dem $start und $step noch mal genau erklären? Das verwirrt mich momentan noch irgendwie. Also oben versteh ich es noch, da ist $start bei 0 und $step bei 2. Er soll also bei 0 Anfangen und 2 auflisten, so steht es ja in $sql2

    Bloß ab diesem Teil verwirrt es mich:
    PHP:
    1. //Link zu älteren Einträgen einblenden
    2. $start = $start + $step;
    3. echo "<p>";
    4. if ($start < $zeilen) { // if-Anfang
    5.     echo "[ <a href=\"index.php?start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]";
    6. }
    Da blick ich einfach nicht mehr durch.





    2.: Eine "Aufgabe" in dem Buch, ist es, das gleiche wie gerade (also das mit den älteren Beiträgen anzuzeigen) mit neueren Beiträgen zu machen.
    Habe es so versucht:
    PHP:
    1.  
    2. if ($start > $step && $start <= $zeilen) {
    3.     $neuer = $_GET['start'];
    4.     $neuer = $neuer - $step;
    5.     echo "[ <a href=\"index.php?start=$neuer\"> Neuere Eintr&auml;ge</a> >> ] ";
    6. }
    7.  
    Aber das funktioniert nur, wenn es mehr als 4 Beiträge oder so gibt, und das ist ja eigentlich nicht so toll^^


    3. Is jetzt ein bisschen Offtopic, aber ich möchte für so was kein neuen Thread öffnen:
    In dem Code ist das hier:
    PHP:
    1.  
    2. $muster = "/^[0-9]+$/"; //reg. Ausdruck für Zahlen
    3.  
    Damit kann man ja nicht nur prüfen, ob Zahlen enthalten sind. Sondern auch, ob irgendetwas anderes 'vorhanden' ist (oder?)
    Aber wie heißt so was? Und wie setzt sich das zusammen?


    Danke schon mal für eure Hilfe

    Lg
    Dennis
  2. ComFreek

    ComFreek Mod | @comfreek Moderator

    Erstmal: Wenn du den Code, den du hier eingefügt hast, vom Buch hast, dann würde ich mir schleunigst ein anderes Buch zulegen!!

    Da sind so viele unnütze Codestellen und Fehler drin, die man alle vermeiden sollte und auch sehr leicht kann!

    Nun ja, zu deinen Fragen:

    1.) Deine Tabelle ist im Prinzip eine lange Liste von Datensätzen (Zeilen mit Daten).
    Nun stellt $start eben die "Anfangsleseposition" dar und $step repräsentiert die Anzahl der zu lesenden Datensätze.

    Code (PHP):
    1.  
    2. //Link zu älteren Einträgen einblenden
    3. $start = $start + $step;
    4. echo "<p>";
    5. if ($start < $zeilen) { // if-Anfang
    6.     echo "[ <a href=\"index.php?start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]";
    7.  
    Dieser Code gibt einfach einen Link aus, der die nächsten Datensätze anzeigt bzw. die älteren Einträge aufgrund der Sortierung im MySQL-Query.


    2.) Der Code müsste so lauten:
    Code (PHP):
    1.  
    2. $newStart = $start-$step;
    3.  
    4. if ($newStart<0)
    5. {
    6.   $newStart = 0;
    7. }
    8. echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
    9.  
    Du ziehst einfach $step vom aktuellen $start ab. D.h. wenn der Benutzer auf "Ältere Einträge" geklickt hat, machst du dies somit rückgängig.
    Ansonsten kann es beim Start der Auflistung ($start=0) dann dazu kommen, dass $newStart<0 wird; dies verhindern wir mit dem IF-Block!

    3.) Eigentlich kannst du statt diesem regulären Ausdruck auch [phpf]is_numeric[/phpf] verwenden.
    Wenn andere Zeichen als Zahlen im String vorkommen, gibt [phpf]preg_match[/phpf] 0 zurück, da im Regex-Pattern ^ und $ benutzt worden sind.
    ^ stellt den Anfang eines Strings dar, wobei $ das Ende repräsentiert.
  3. d3mueller

    d3mueller Grünschnabel

    Hey, danke :D

    Und ja, der Code ist exakt der aus dem Buch.
    Kennst du vllt eins, das für Anfänger geeignet, und besser ist als das hier? Weil wenn du sagst, das da unnütze stellen und Fehler drin sind, dann wär es besser, sowas nicht zu lernen, oder?

    Habe das halt vor 3 Jahren gekauft, und damals kein anderes gefunden, was so für Anfänger ist.


    Lg
    Dennis
  4. ComFreek

    ComFreek Mod | @comfreek Moderator

  5. d3mueller

    d3mueller Grünschnabel

    Das Buch sieht gut aus.
    Das werd ich mir, denke ich, zulegen.

    wegen dem Code bei 2.
    Irgendwie geht der bei mir nicht.
    Wenn ich den unten drunter einfüge, dann erscheint nur ein Link zum aktuellen Wert von $start.
    Muss ich das vllt so machen?

    PHP:
    1.  
    2. $newStart = $_GET['start'] - $step;
    3.  
    4. if ($newStart < 0)
    5. {
    6.   $newStart = 0;
    7. }
    8. echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";  
    9.  
    So funktioniert das bei mir.
  6. ComFreek

    ComFreek Mod | @comfreek Moderator

    Bist du dir sicher, dass du min. 1 Mal auf "Ältere Beiträge anzeigen" geklickt hast?
    Sonst verweist der Link nämlich auf ?start=0;

    Ist im Prinzip dasselbe. Aber eigentlich sollte $_GET['start'] schon vom Typ Integer sein.

    Eigentlich kannst du den IF-Block mit isset($_GET['start']); so abändern:
    Code (PHP):
    1.  
    2. if (isset($_GET['start']))
    3. {
    4.   $start = intval($_GET['start']);
    5.   if ($start<0)
    6.   {
    7.     $start = 0;
    8.   }
    9. }
    10.  
    Du kannst den Link zu den neueren Einträgen auch nur einblenden, wenn es welche relativ von der aktuellen Ansicht aus auch gibt:
    Code (PHP):
    1.  
    2. $newStart = $start-$step;
    3.  
    4. if ($newStart<0)
    5. {
    6.   $newStart = 0;
    7. }
    8. if ($newStart!=$start)
    9. {
    10.   echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
    11. }
    12.  
  7. d3mueller

    d3mueller Grünschnabel

    Hi, danke, hab das jetzt so gemacht:
    PHP:
    1.  
    2. @$newStart = $_GET['start'] - $step;
    3. if (isset($_GET['start']))
    4. {
    5.   $start = intval($_GET['start']);
    6.   if ($start<0)
    7.   {
    8.     $start = 0;
    9.   }
    10. }
    11.  
    12. if ($newStart<0)
    13. {
    14.   $newStart = 0;
    15. }
    16. if ($newStart!=$start)
    17. {
    18.   if (isset($_GET['start'])) { 
    19.   echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
    20.   }
    21. }  
    22.  
    Habe im Prinzip nur noch einen if-Block hingemacht, dass wenn $_GET["start"] nicht existert, es nicht angezeigt werden soll, denn dann ist es ja auch auf der aktuellsten seite, und somit kann es auch nicht weiter vorwärts gehen (glaub ich^^)
  8. d3mueller

    d3mueller Grünschnabel

    Hi, ich bins nochmal.
    Also der Code funktioniert eigentlich.

    Jetzt wollte ich ihn aber in meine News-Seite einbauen, die im Prinzip dasselbe ist. Also sie greift auch auf eine Datenbanktabelle zu. Habe den Code so eingebaut:
    srym dass der Code so lang ist, aber ich wieß halt nicht, bei welcher Stelle im Code was nicht stimmt.
    PHP:
    1.  
    2. <?php
    3.  
    4. ini_set('display_errors', 1);
    5.  
    6. $db = @new MySQLi('localhost', 'root', '', 'newsscript');
    7.     die('in news.php: Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
    8. }
    9. //Hier setze ich $start und $step
    10. $start = 0; //Startwert setzen (0 = 1. Zeile)
    11. $step = 2; // Wie viele Einträge gleichzeitig?
    12.  
    13.  
    14. $sqlrows = "SELECT * FROM news";
    15. $result = mysql_query($sqlrows);
    16. $zeilen = mysql_num_rows($result);
    17.  
    18.  
    19. $sql = "SELECT * FROM news ORDER BY datum DESC LIMIT $start, $step";
    20.  
    21.  
    22. $result = $db->query($sql);
    23. if (!$result) {
    24.     die ('Konnte den Folgenden Query nicht senden: '.$sql."<br />\nFehlermeldung: ".$db->error);
    25. }
    26. if (!$result->num_rows) {
    27.     echo "<fieldset class=\"fehler\">Es sind keine Newsbeiträge vorhanden</fieldset>";
    28. } else {
    29.     while ($row = $result->fetch_assoc()) {
    30.         echo '<section class="news-box"><section class="news-box-titel">'.$row['titel']." | \n";
    31.         echo '<span>'.$row['datum']."</span></section>\n";
    32.         echo '<p><img src="'.$row['bild'].'" width="200px" height="200px"></p>'. "\n";
    33.         echo ''.$row['inhalt']."</p></section>\n";
    34.     }
    35. }
    36. ?>
    37. <br><br>
    38. <?php // Hier habe ich den Code von gestern eingefügt, der eigentlich funktioniert hat.
    39.  $start = $start + $step;
    40. echo "<p>";
    41. if ($start < $zeilen) {
    42.     echo "[ <a href=\"index.php?action=news&start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]"; // Hier musste ich noch ?action=news einfügen, denn die Seite arbeitet mit includes
    43. }
    44. @$newStart = $_GET['start'] - $step;
    45. if (isset($_GET['start']))
    46. {
    47.   $start = intval($_GET['start']);
    48.   if ($start<0)
    49.   {
    50.     $start = 0;
    51.   }
    52. }
    53.  
    54. if ($newStart<0)
    55. {
    56.   $newStart = 0;
    57. }
    58. if ($newStart!=$start)
    59. {
    60.   if (isset($_GET['start'])) { 
    61.   echo "[ <a href=\"index.php?action=news&start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
    62.   }
    63. }  
    64.  
    Also das mit dem anzeigen funktioniert schon, je nachdem welchen Wert ich bei $step eingebe, zeigt er entsprechend viele Einträge an.
    Aber wenn ich dann auf den Link zu den älteren Beiträgen klicke, verweist er auf ?start=2, aber die angezeigten Einträge sind noch die selben. Und wenn ich noch einmal druafklicke, verweist er immer noch auf ?start=2

    Wo liegt mein Fehler?

    Danke schon mal
    Lg
    Dennis
  9. Yaslaw

    Yaslaw n/a Moderator

    Du arbeitest deinen Code immer mit start=0, step=2 ab. Denn $_GET wertest du erst nach der Ausgabe der DB-Daten aus.

    Ich persönlich würde nicht mit LIMIT abreiten. Es verkompliziert die Sache nur.
    PHP:
    1.  Einfache Seitennavigation[/url]
  10. d3mueller

    d3mueller Grünschnabel

    hi, danke, ich änder es mal

    naja, "einfach" sieht das überhaupt nicht aus, ich weiß nicht, ob das mit dem Aufbau meiner Seite funktioniert.
  11. Yaslaw

    Yaslaw n/a Moderator

    Einfach Aussehen heisst nicht das es einfach ist. Ist sind 'viele' Zeilen. Wobei das meiste nur Definition sind. Der eigentliche Kern 'Erstellen der Navigation' ist nicht so besonders komplex und kann eigentlich so übernommen werden.
    Aber selber eine Navigation bauen ist auch etwas interessantes. Darum will ich dir meine Lösung auch nicht aufdrängen - es war mehr als Input gedacht.

Diese Seite empfehlen