PHP und MySQL - Neuere Beiträge aus Datenbank zeigen

d3mueller

Mitglied
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:
<?php
include ("edit/zugriff.inc.php");
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Unser CMS</title>
<style type="text/css">
body {
	background: gray;
}
#wrapper {
	width: 900px;
	border: solid 1px;
	background-color: white;
	padding: 10px;
}
h1 {
	background: gray;
	color: white;
}
</style>
</head>

<body>
<div id="wrapper">
<h1>Unser Webtagebuch</h1>
<div>[ <a href="index.php">Home</a> ]</div>

<?php
$start = 0; //Startwert setzen (0 = 1. Zeile)
$step = 2; // Wie viele Einträge gleichzeitig?
$muster = "/^[0-9]+$/"; //reg. Ausdruck für Zahlen
//Startwert verändern
if (isset($_GET['start'])) {
	if (preg_match($muster, $_GET['start']) == 0) {
		$start = 0; //Bei Manipulation Rückfall auf 0
	} else {
		$start = $_GET['start'];
	}
}
$sql1 = "SELECT * FROM cms";
$sql2 = "SELECT * FROM cms ORDER BY id DESC LIMIT $start, $step";
$result1 = mysql_query($sql1);
$zeilen = mysql_num_rows($result1);
$result2 = mysql_query($sql2);
echo "<p>Anzahl der Eintr&auml;ge: $zeilen</p>\n";

//while-Schleife Anfang
while ($row = @mysql_fetch_assoc($result2)) {
	$Eintrag = nl2br($row['Eintrag']);
	//Einträge anzeigen
	  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";
} //while-Ende

//Link zu älteren Einträgen einblenden
$start = $start + $step;
echo "<p>";
if ($start < $zeilen) { // if-Anfang
	echo "[ <a href=\"index.php?start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]";
}
echo "[ <a href='#wrapper'>nach oben</a> ] </p>\n";
mysql_close();
?>
</body>
</html>
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:
//Link zu älteren Einträgen einblenden
$start = $start + $step;
echo "<p>";
if ($start < $zeilen) { // if-Anfang
	echo "[ <a href=\"index.php?start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]";
}
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:
if ($start > $step && $start <= $zeilen) {
	$neuer = $_GET['start'];
	$neuer = $neuer - $step;
	echo "[ <a href=\"index.php?start=$neuer\"> Neuere Eintr&auml;ge</a> >> ] ";
}
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:
$muster = "/^[0-9]+$/"; //reg. Ausdruck für Zahlen
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
 
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.

PHP:
//Link zu älteren Einträgen einblenden 
$start = $start + $step; 
echo "<p>"; 
if ($start < $zeilen) { // if-Anfang 
    echo "[ <a href=\"index.php?start=$start\"> &lt;&lt; &Auml;ltere Eintr&auml;ge</a> ]";
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:
PHP:
$newStart = $start-$step;

if ($newStart<0)
{
  $newStart = 0;
}
echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
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.
 
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
 
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:
$newStart = $_GET['start'] - $step;

if ($newStart < 0)
{
  $newStart = 0;
}
echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
So funktioniert das bei mir.
 
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:
PHP:
if (isset($_GET['start']))
{
  $start = intval($_GET['start']);
  if ($start<0)
  {
    $start = 0;
  }
}

Du kannst den Link zu den neueren Einträgen auch nur einblenden, wenn es welche relativ von der aktuellen Ansicht aus auch gibt:
PHP:
$newStart = $start-$step;

if ($newStart<0)
{
  $newStart = 0;
}
if ($newStart!=$start)
{
  echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
}
 
Hi, danke, hab das jetzt so gemacht:
PHP:
@$newStart = $_GET['start'] - $step;
if (isset($_GET['start']))
{
  $start = intval($_GET['start']);
  if ($start<0)
  {
    $start = 0;
  }
} 

if ($newStart<0)
{
  $newStart = 0;
}
if ($newStart!=$start)
{
  if (isset($_GET['start'])) {	
  echo "[ <a href=\"index.php?start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
  }
}
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^^)
 
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:
<?php
 
error_reporting(E_ALL);
ini_set('display_errors', 1);

$db = @new MySQLi('localhost', 'root', '', 'newsscript');
if (mySQLi_connect_errno()) {
	die('in news.php: Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
}
//Hier setze ich $start und $step
$start = 0; //Startwert setzen (0 = 1. Zeile)
$step = 2; // Wie viele Einträge gleichzeitig?


$sqlrows = "SELECT * FROM news";
$result = mysql_query($sqlrows);
$zeilen = mysql_num_rows($result);


$sql = "SELECT * FROM news ORDER BY datum DESC LIMIT $start, $step";


$result = $db->query($sql);
if (!$result) {
    die ('Konnte den Folgenden Query nicht senden: '.$sql."<br />\nFehlermeldung: ".$db->error);
}
if (!$result->num_rows) {
    echo "<fieldset class=\"fehler\">Es sind keine Newsbeiträge vorhanden</fieldset>";
} else {
    while ($row = $result->fetch_assoc()) {
        echo '<section class="news-box"><section class="news-box-titel">'.$row['titel']." | \n";
        echo '<span>'.$row['datum']."</span></section>\n";
		echo '<p><img src="'.$row['bild'].'" width="200px" height="200px"></p>'. "\n";
     	echo ''.$row['inhalt']."</p></section>\n";
    }
}
?>
<br><br>
<?php // Hier habe ich den Code von gestern eingefügt, der eigentlich funktioniert hat.
 $start = $start + $step;
echo "<p>";
if ($start < $zeilen) { 
	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
}
@$newStart = $_GET['start'] - $step;
if (isset($_GET['start']))
{
  $start = intval($_GET['start']);
  if ($start<0)
  {
    $start = 0;
  }
} 

if ($newStart<0)
{
  $newStart = 0;
}
if ($newStart!=$start)
{
  if (isset($_GET['start'])) {	
  echo "[ <a href=\"index.php?action=news&start=$newStart\"> Neuere Eintr&auml;ge</a> >> ]";
  }
}

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
 
hi, danke, ich änder es mal

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

Neue Beiträge

Zurück