Bestimmte Anzahl von Gästebucheinträgen anzeigen
Hallo Freunde der Kunst,
ich bin PHP-Anfänger und komme daher nicht so ganz weiter
Ich habe ein Gästebuch programmiert, welches an sich auch gut funktioniert. Das ganze läuft nur über eine Textdatei, in die die Einträge reingeschrieben werden. Kein SQL und auch kein Array. Nun stehe ich vor dem Problem, dass auf der ersten Seite z.B. nur 10 Einträge erscheinen sollen, für nachfolgende soll dann eine neue Seite begonnen werden bzw. die alten Beiträge werden nach hinten gerückt. So, wie man sich halt ein normales GB vorstellt. Ich weiss wirklich nicht, wie ich das ganze anpacken soll und bin für jede Hilfe dankbar.
Mfg
Mitchell
ich bin PHP-Anfänger und komme daher nicht so ganz weiter
Ich habe ein Gästebuch programmiert, welches an sich auch gut funktioniert. Das ganze läuft nur über eine Textdatei, in die die Einträge reingeschrieben werden. Kein SQL und auch kein Array. Nun stehe ich vor dem Problem, dass auf der ersten Seite z.B. nur 10 Einträge erscheinen sollen, für nachfolgende soll dann eine neue Seite begonnen werden bzw. die alten Beiträge werden nach hinten gerückt. So, wie man sich halt ein normales GB vorstellt. Ich weiss wirklich nicht, wie ich das ganze anpacken soll und bin für jede Hilfe dankbar.
<?php
if (isset($_POST['action']) && $_POST['action'] == "add"){
if ($_POST['name'] == "" || $_POST['text'] == ""){
echo "Du hast nicht alle Felder ausgefüllt !<hr>";
}
else{
$guestbook = file_get_contents("gaestebuch.txt");
$_POST['text'] = str_replace("\n","<br>",$_POST['text']);
$_POST['eintrag'] = "<span style=font-size:23>Eintrag von: <a href=\"mailto:$_POST[mail]\">$_POST[name]</a><br>
$_POST[text]<br>
<a href=$_POST[www] target=_blank>$_POST[www]</a><hr></span>";
$datei = fopen("eintraege.txt","w+");
fwrite($datei,$_POST['eintrag'].$guestbook);
fclose($datei);
echo "Danke für deinen Eintrag <i>$_POST[name]</i><hr>";
}}
readfile("eintraege.txt");
?>
Mfg
Mitchell
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85343
Url: https://administrator.de/contentid/85343
Ausgedruckt am: 19.12.2024 um 12:12 Uhr
7 Kommentare
Neuester Kommentar
@Mitchell
Hi,
hab hier ein bißchen was erstellt und(hoffe) ausreichend kommentiert.
Die Anzahl Beiträge, die pro Seite angezeigt wird, kann in einer Variablen
abgelegt werden.
Die Seiten werden unten in Linkform ausgegeben, so dass man eine Seite
direkt anwählen kann.
Hoffe, das hilt dir erstmal weiter.
Gruß
Günni
Script guestbook.php
Hi,
hab hier ein bißchen was erstellt und(hoffe) ausreichend kommentiert.
Die Anzahl Beiträge, die pro Seite angezeigt wird, kann in einer Variablen
abgelegt werden.
Die Seiten werden unten in Linkform ausgegeben, so dass man eine Seite
direkt anwählen kann.
Hoffe, das hilt dir erstmal weiter.
Gruß
Günni
Script guestbook.php
<?
if(isset($_POST['cmd'])){
$msg=str_replace("\n","",$_POST['eintrag']);
$eintrag=$_POST['nick']."||".$_POST['mail']."||".date("Y-m-d")."||".$msg;
$handle = fopen("/www/pub/guest.txt","a");
fputs($handle, $eintrag."\n");
fclose($handle);
//Nach Eintrag Seite neu aufrufen, da sonst die Postdaten noch
//gespeichert sind und ein Klick auf Neuladen immer wieder
//den selben Eintrag speichert
header("location:guestbook.php");
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Gästebuch</title>
<style type="text/css">
a:link { text-decoration:none; }
a:visited { text-decoration:none; }
a:hover { text-decoration:none; }
a:active { text-decoration:none; }
h4 {
border: 1px solid blue;
background-color: #999999;
display:block;
padding: 4px;
width: 250px;
}
</style>
<script type="text/javascript">
<!--
function check_eingabe(){
ok=false;
//Prüfen, ob Textfeld nick Buchstaben enthält, damit schonmal
//das Feld nicht leer bleibt.
muster=/[A-Za-zÄÖÜäöüß]/;
test=muster.exec(document.formular.nick.value);
if(test){ok=true;} // Wenn ja, dann O.K.
if(!ok || document.formular.nick.value=="Bitte korrekt ausfüllen!"){
document.formular.nick.value="Bitte korrekt ausfüllen!";
return false;
}
return true;
}
// -->
</script>
</head>
<body>
<h2>Gästebuch</h2><br><br>
<form action="guestbook.php" method="post" name="formular" onsubmit="return check_eingabe()">
<table>
<tr>
<td><h3>Nickname</h3></td>
<td><input type="text" name="nick" /></td>
</tr>
<tr>
<td><h3>eMail</h3></td>
<td><input type="text" name="mail" /></td>
</tr>
<tr>
<td valign="top"><h3>Eintrag</h3></td>
<td><textarea name="eintrag" cols="50" rows="10"></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="cmd" value="Senf dazugeben"/></td>
</tr>
</table>
</form>
<?
//Einträge ausgeben
//Datei zeilenweise einlesen
$handle = fopen("/www/pub/guest.txt","r");
while($line=fgets($handle,1024)){
$lines=$line;
}
fclose($handle);
//
if(isset($_GET['next'])){
$i=$_GET['next'];
}else{
$i=0;
}
//Wieviele Einträge sollen pro Seite ausgegeben werden
$items=2;
if($lines){
//Array undrehen, damit neue Einträge zuerst angezeigt werden
$lines=array_reverse($lines);
while($i<count($lines)){
$msg=explode("||",$lines[$i]);
echo "Nickname: ".$msg."<br>";
echo "eMail: <a href=mailto:".$msg[1].">".$msg[1]."</a><br><br>";
echo "Dein Beitrag vom ".$msg[2].":<br>";
echo "<h4>".$msg[3]."</h4><br><br>";
$i++;
//Einträge pro Seite erreicht, while verlassen
if($i%$items==0){
break;
}
}
//Seitenausgabe mit Links
echo "Seite ";
for($j=1,$k=0;$k<count($lines);$j++,$k+=$items){
echo "<a href=guestbook.php?next=".$k.">". $j ."|</a>";
}
}
?>
</body>
</html>
@Mitchell
Hi,
Lies' mal dazu die Fehlermeldung:
. . . bedeutet, dass übers HTTP-Protokoll kein Schreiben möglich ist.
Ich hab' mein Script eben umgeändert auf die gleiche Syntax und erhalte
auch die gleiche Fehlermeldung. Wenn die Textdatei im gleichen Verzeichnis ist,
wie das Script, so schreibst du einfach:
$handle = fopen("guest.txt","a");
Die nachfolgenden Fehlermeldungen resultieren nur auf der ersten.
Gruß
Günni
Hi,
$handle = fopen("http://localhost/guest.txt","a");
Lies' mal dazu die Fehlermeldung:
. . . HTTP wrapper does not support writeable connections. . . .
. . . bedeutet, dass übers HTTP-Protokoll kein Schreiben möglich ist.
Ich hab' mein Script eben umgeändert auf die gleiche Syntax und erhalte
auch die gleiche Fehlermeldung. Wenn die Textdatei im gleichen Verzeichnis ist,
wie das Script, so schreibst du einfach:
$handle = fopen("guest.txt","a");
Die nachfolgenden Fehlermeldungen resultieren nur auf der ersten.
Gruß
Günni
@Mitchell
Hi,
Die Funktion fgets liest Zeichen aus einer Datei bis
- ein Zeilenende erreicht wurde
- das Dateiende erreicht wurde
- die Anzahl Zeichen gelesen wurde, z.B. 1024
1024 Zeichen ist jetzt einfach mal 'ne halbe DinA-4 Seite, soviel schreibt wohl kaum
jemand ins Gästebuch.
$lines ist ein Array, $line ist die Zeile aus fgets, die in das Array eingelesen wird.
Genau! Wenn du mehrere Einträge im GB hast, werden am Schluß Links auf die
Seite selber dargestellt. Dem Link wird die Variable next mit einem Wert angehangen.
Wenn du nun die Seite über einen dieser Links aufrufst, enthält die Variable next einen
nummerischen Wert, ab welchen Gästebucheinträge angezeigt werden.
Beim Speichern in die Datei trenne ich Nickname, eMail, Eintragsdatum und Eintrag selber
$lines[$i] enthält z.B. eine Zeile aus der GB-Datei, darin steht:
bestimmt sozusagen, welcher Index des Arrays welchen Teil aus $lines[$i] zugewiesen bekommt.
$msg enthält dann:
$msg="Anton"
$msg[1]=" ant@web.de "
$msg[2]=" 2008-04-12"
$msg[3]=" Hallo Mitchell !!"
Dieses Array kannst du dann ausgeben, in etwa:
echo "Nickname:".$msg."<br>";
usw..
In $items legst du fest, wieviel GB-Einträge pro Seite angezeigt werden sollen.
Und immer wenn der Rest der Division von $i geteilt durch $items 0 ist,
wird die Schleife und damit das Ausgeben der in $lines gespeicherten Zeilen
abgebrochen.
$j ist die Seitenzahl, die als Link auf die Seite angezeigt wird, $k ist die Startzahl, ab welcher Zeile
$lines ausgelesen wird. Deshalb auch das Konstrukt:
$i=$_GET['next'];
}else{
$i=0;
}
Wenn du eine der Seitenzahlen angeklickt hast, die natürlich erst angezeigt werden,
wenn Einträge in der Datei bestehen, dann ist die Variable next mit einem Wert gefüllt.
Dieser Wert wird $i zugewiesen, und ab dieser Zeile wird das Array $lines, das oben
im Script aus der Datei mit Zeilen gefüllt wird, ausgelesen bis Zeilenzahl geteilt durch
$items = 0 ist.
Na dann hoffe ich, ein wenig Licht in die Sache gebracht zu haben.
Gruß
Günni
Hi,
sorry, dass ich erst jetzt antworte. Habe in den letzten Wochen versucht, mich in das Script reinzudenken, weil ich es natürlich selber schaffen will, aber es kommt einfach nicht. Habe derzeit eine Lern-DVD und ein PHP Buch hier, aber irgendwie wollen mir die Schleifen nicht wirklich iin den Kopf. Also wie versprochen, meine Fragen
$handle = fopen("/www/pub/guest.txt","r");
while($line=fgets($handle,1024)){
$lines=$line;
}
Was passiert hier? Ich kann mir das anschauen, solange ich will, das Verständnis kommt nicht auf. Die 1. Zeile versteh ich noch, aber die 2. und 3. sagt mir schon nichts mehr. Warum die while-Schleife, was machen die "1024" da und was passiert in Zeile 3?
Die Funktion fgets liest Zeichen aus einer Datei bis
- ein Zeilenende erreicht wurde
- das Dateiende erreicht wurde
- die Anzahl Zeichen gelesen wurde, z.B. 1024
1024 Zeichen ist jetzt einfach mal 'ne halbe DinA-4 Seite, soviel schreibt wohl kaum
jemand ins Gästebuch.
$lines ist ein Array, $line ist die Zeile aus fgets, die in das Array eingelesen wird.
$i=$_GET['next'];
}else{
$i=0;
}
sagt mir wirklich gar nichts. Er holt sich per GET "next", ansonsten ist i=0 ???
Genau! Wenn du mehrere Einträge im GB hast, werden am Schluß Links auf die
Seite selber dargestellt. Dem Link wird die Variable next mit einem Wert angehangen.
Wenn du nun die Seite über einen dieser Links aufrufst, enthält die Variable next einen
nummerischen Wert, ab welchen Gästebucheinträge angezeigt werden.
while($i<count($lines)){
$msg=explode("||",$lines[$i]);
schon wieder ein großen Fragezeichen für mich, was passiert und warum?
$i++;
Er zählt 1 hinzu, ok...leider weiß ich nicht, was i ist. Ich nehme mal an, die Beiträge!?
Beim Speichern in die Datei trenne ich Nickname, eMail, Eintragsdatum und Eintrag selber
", in der vagen Hoffnung, dass niemand im Eintrag " |
" abgeschnitten. |
ant@web.de | 2008-04-12 |
",$lines[$i]); entsteht aus $msg ein Array. Das Trennzeichen " |
$msg enthält dann:
$msg="Anton"
$msg[1]=" ant@web.de "
$msg[2]=" 2008-04-12"
$msg[3]=" Hallo Mitchell !!"
Dieses Array kannst du dann ausgeben, in etwa:
echo "Nickname:".$msg."<br>";
usw..
if($i%$items==0){
break;
Wenn der Rest 0 ist, abbruch. Der Rest von was?
In $items legst du fest, wieviel GB-Einträge pro Seite angezeigt werden sollen.
Und immer wenn der Rest der Division von $i geteilt durch $items 0 ist,
wird die Schleife und damit das Ausgeben der in $lines gespeicherten Zeilen
abgebrochen.
for($j=1,$k=0;$k<count($lines);$j++,$k+=$items){
echo "<a href=guestbook.php?next=".$k.">". $j ."|</a>";
Diese zwei Zeilen haben mich echt zum Verzweifeln gebracht, als PHP Neuling . Warum die for-Schleife, was ist "j, was "k"....da versteh ich echt nur Bahnhof.
$j ist die Seitenzahl, die als Link auf die Seite angezeigt wird, $k ist die Startzahl, ab welcher Zeile
$lines ausgelesen wird. Deshalb auch das Konstrukt:
$i=$_GET['next'];
}else{
$i=0;
}
Wenn du eine der Seitenzahlen angeklickt hast, die natürlich erst angezeigt werden,
wenn Einträge in der Datei bestehen, dann ist die Variable next mit einem Wert gefüllt.
Dieser Wert wird $i zugewiesen, und ab dieser Zeile wird das Array $lines, das oben
im Script aus der Datei mit Zeilen gefüllt wird, ausgelesen bis Zeilenzahl geteilt durch
$items = 0 ist.
So...ich weiß, es sind eine Menge Fragen und ich denke, jemand der sich mit PHP auskennt, werden diese wohl eher ein müdes Lächeln wert sein, aber für mich ist es wirklich schwierig, das nachzuvollziehen.
Gruß
Günni