mitchell
Goto Top

Bestimmte Anzahl von Gästebucheinträgen anzeigen

Hallo Freunde der Kunst,

ich bin PHP-Anfänger und komme daher nicht so ganz weiter face-smile

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&uuml;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&uuml;r deinen Eintrag <i>$_POST[name]</i><hr>";  
}}
readfile("eintraege.txt");  
?>

Mfg

Mitchell

Content-ID: 85343

Url: https://administrator.de/contentid/85343

Ausgedruckt am: 19.11.2024 um 06:11 Uhr

Guenni
Guenni 14.04.2008 um 20:57:19 Uhr
Goto Top
@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

<?
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&auml;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
Mitchell 15.04.2008 um 11:36:39 Uhr
Goto Top
Hi Günni,

erstmal danke für die Hilfe, das bringt mich bestimmt weiter. Die Fragen zum Script kommen später, weil da doch noch die ein oder andere Zeile ist, aus der ich (als Anfänger) nicht schlau werde.

Erstmal bedrückt mich was anderes. Ich wollte das Script gerade auf meinem Apache testen, worauf ich komischerweise beim absenden der Formulardaten einen Scriptfehler bekomme. Scheinbar fehlen ihm da die Schreibrechte, aber irgendwie komm ich nicht dahinter, warum. Vielleicht kannst du mir da was zu sagen?

Warning: fopen(http://localhost/guest.txt) [function.fopen]: failed to open stream: HTTP wrapper
does not support writeable connections. in C:\Programme\Apache2.2\htdocs\guestbook.php on
line 5
$handle = fopen("http://localhost/guest.txt","a");  

Warning: fputs(): supplied argument is not a valid stream resource in
C:\Programme\Apache2.2\htdocs\guestbook.php on line 6
fputs($handle, $eintrag."\n");  

Warning: fclose(): supplied argument is not a valid stream resource in
C:\Programme\Apache2.2\htdocs\guestbook.php on line 7
fclose($handle);

Warning: Cannot modify header information - headers already sent by (output started at
C:\Programme\Apache2.2\htdocs\guestbook.php:5) in
C:\Programme\Apache2.2\htdocs\guestbook.php on line 11
header("location:guestbook.php");  

Mfg

Mitchell
Guenni
Guenni 15.04.2008 um 20:53:24 Uhr
Goto Top
@Mitchell

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
Mitchell 27.04.2008 um 12:34:54 Uhr
Goto Top
Hi Günni,

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 face-smile

$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?

$i=$_GET['next'];  
}else{
            $i=0;
            }
sagt mir wirklich gar nichts. Er holt sich per GET "next", ansonsten ist i=0 ???
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!?
if($i%$items==0){
     break;
Wenn der Rest 0 ist, abbruch. Der Rest von was?
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 face-smile. Warum die for-Schleife, was ist "j, was "k"....da versteh ich echt nur Bahnhof.

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.

Mfg

Mitchell

PS: Der Schreibfehler mit dem Localhost müsste mir aber echt auffallen müssen, danke ^^
Guenni
Guenni 30.04.2008 um 20:31:01 Uhr
Goto Top
@Mitchell
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.
$lines[$i] enthält z.B. eine Zeile aus der GB-Datei, darin steht:

ant@web.de2008-04-12

",$lines[$i]); entsteht aus $msg ein Array. Das Trennzeichen "
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..

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.
Na dann hoffe ich, ein wenig Licht in die Sache gebracht zu haben.

Gruß
Günni
Mitchell
Mitchell 05.05.2008 um 11:12:28 Uhr
Goto Top
da muss ich echt erstmal durchsteigen face-smile

Ich danke dir auf jeden Fall schonmal dafür. Sobald ich das Script fertig habe, so, wie ich es brauche, sag ich bescheid und natürlich bei Fragen.

Mfg

Mitchell
Mitchell
Mitchell 13.06.2008, aktualisiert am 18.10.2012 um 18:35:51 Uhr
Goto Top
Ich werde mich dem Thema später widmen, zuerst muss ich Das hier fertig kriegen face-smile

Mfg

Mitchell