Sorry, hab mir Deins jetzt nciht genauer angeschaut, sondern mal "meins" von dem letzen Post fertiggemacht. Waren noch n paar Fehlerlies drin, jetzt geht's aber (meines Erachtens) ohne Probleme: - Zeilenumbruch ist drin - "|" wird als Trennzeichen genommen.
wieder das alte Spiel mit start,formular,eintragen:
So ist es. $handle "repräsentiert" den Inhalt der Datei. Mir fiel noch etwas zu meinem Code ein: Der ist jetzt nicht gegen Fehler gesichert. Sollte also in der gbdok.txt etwas nicht "Muster-konformes" stehen, kommt etwas unsinniges beim Lesen heraus. Die Eintragen.php macht aber nur sinnvolle Einträge, müsste also schon von einem anderen Script manipuliert werden.
Wichtig für alle, die das obige GB benutzen woll(t)en:
Mir ist gerade als ich das GB mal selbst einbauen wollte ein blöder Kinderfehler aufgefallen.
Zumal die GB-Datei Zeichen-für-Zeichen ausgelesen wird und php eine meiner Meinung nach etwas blöde Variablen-Handhabung hat, wird eine Datei als "beendet" eingestuft, wenn in der Datei eine "0" vorkommt.
Das geschieht zB an der Stelle:
Code:
if($zeichen) { bla
Dummerweise wird die Null gleichzeitig als "false" gehandhabt und somit "denkt" das Script, es folgt kein Zeichen mehr. Überlege gerade wie ich das umgehen kann. Wenn jemand Ideen hat wäre ich sehr dankbar.
Okay, ich hab ne Lösung, allerdings bin ich nicht sonderlich zufrieden damit. Ist nicht sehr "sauber" programmiert, aber zweckmäßig. Statt nur auf $zeichen (==true) abzufragen, frage ich jetzt ab:
Code:
if($zeichen || ord($zeichen)==48)
Also ob $zeichen etwas enthält oder der ASCII-Wert des Zeichens gleich 48 (--> "0") ist.
Ich hab mal versucht alles in Txtdatei-basierendes Gästebuch in eine Datei (weil 3 waren mir zu viel (von wegen Start.hph,Eintrg.php etc)). Funktioniert soweit..vielleicht kann ja jemand noch einbauen das man die einträge auf mehrer seiten verteilt (z.b. 10 pro seite).. Sollte jemand das script aus irgendeinem grund für totalen schwachsin halten sacht bescheid, war ja nur ein versuch ;-)
einzige voraussetzung ist jetzt das eine leere textdatei im selben ordner liegt die mygb.txt heißt. Oder den code ändern :-)
Code:
<?
//Der PHP-Teil. Ohne PHP (oder einer anderen Internettauglichen //Programmiersprache (wie z.B. Perl)) wird man kein Gästebuch zum //Laufen bekommen.
//Script wird nur ausgeführt wenn der Benutzer auf "Eintragen" gedrückt hat if(isset($_POST['submit'])) { //Alles in eine Variable hintereinander schreiben $GBeintrag = $_POST['myGBname']."|"; $GBeintrag .= $_POST['myGBhp']."|"; $GBeintrag .= $_POST['myGBmail']."|"; $GBeintrag .= date("d.m.y")."|"; //datum muss natürlich auch mit rein
//Falls jemand in der nachricht ein | verwendet hat sollten wir das //ersetzen, da sonst beim auslesen fehler auftauchen $_POST['myGBtext'] = str_replace("|","<!strich!>",$_POST['myGBtext']); //Und dann noch die Zeilenumbrüche raus damit alles in einer Reihe steht //ist kein muss, sieht aber besser aus $_POST['myGBtext'] = str_replace("\r\n","<!umbruch!>",$_POST['myGBtext']);
$GBeintrag .= $_POST['myGBtext']."\r\n";
//Den eintrag in die Textdatei schreiben $openfile = fopen("myGB.txt","a"); fwrite($openfile,$GBeintrag); fclose($openfile); }
//Hier das Gästebuch öffnen und alle Einträge einlesen //nur einlesen wenn auch einträge vorhanden sind if(filesize("myGB.txt")>0) { $openfile = fopen("myGB.txt","r"); $GB = fread($openfile,filesize("myGB.txt")); fclose($openfile);
//Dann die Einzelnen einträge trennen //und als Array speichern $eintraege = explode("\r\n",$GB); }
?>
<!-- Hier der Allgemein bekannte HTML-Teil welcher das Aussehen der Seite und damit das des GBs bestimmt Hier kann man nach belieben alles anpassen bis auf Bestehen bleiben sollten jedoch die integrierten PHP-Anweisungen welche sich zwichschen <? //und ?> befinden. Sebstverständlich können diese natürlich an eine andere Stelle verfrachtet werden. //-->
<!-- EINTRÄGE ANZEIGEN --> <? //PHP-code um die Einträge anzuzeigen
//schleife nur durchlaufen wenn einträge im //GB sind if(filesize("myGB.txt")>0) { //solange einträge vorhanden sind wird eine schleife durchlaufen //von hinten nach vorne (also neueste zuerst) for($a=(count($eintraege)-2);$a>-1;$a--) { //Die einzelnen Teile des Eintrags teilen $Eintrag = explode("|",$eintraege[$a]);
//Dann noch die Sonderstrings wie "<!umbruch!>" und "<!strich!>" wieder //in die ursprünglichen zeichen ersetzen $Eintrag[4] = str_replace("<!umbruch!>","\r\n",$Eintrag[4]); $Eintrag[4] = str_replace("<!strich!>","|",$Eintrag[4]);
Sehr schick. Was mir erstmal auffiel: Du hast vergessen, dass GBlink zu implementieren. Aufgrunddessen wurden Links im Blau des Hintergrundes dargestellt.
Ansonsten sehr cool. Ich teste und bastel gerade mal n bissel. Mal sehen was rauskommt...
ich weiß..nobody is perfect :-) bastel du mal..bin aufs ergebnis gespannt..vielleicht kann man das ja dann irgendwie hier als Hilfe für die vielen "ICH BRAUCH EIN EINFACHES GÄSTEBUCH---JETZT!!!"-schreier verwenden ;-)
kleine Anmerkung noch von mir: Was ist, wenn zufällig 2 oder mehr Zugriffe gleichzeitig auf die Datei erfolgen? Solltest du unbedingt verhinden. Abfangen einfach mit:
Hab mir das auch mal kurz angeschaut: nicht schlecht!
Hier und da hab ich den Code nochmal ein klein wenig reduziert bzw. optimiert:
Code:
<?
//Der PHP-Teil. Ohne PHP (oder einer anderen Internettauglichen //Programmiersprache (wie z.B. Perl)) wird man kein Gästebuch zum //Laufen bekommen.
//Script wird nur ausgeführt wenn der Benutzer auf "Eintragen" gedrückt hat if($_POST['submit']) { //Alles in eine Variable hintereinander schreiben $GBeintrag = $_POST['myGBname']."|"; $GBeintrag .= $_POST['myGBhp']."|"; $GBeintrag .= $_POST['myGBmail']."|"; $GBeintrag .= date("d.m.y")."|"; //datum muss natürlich auch mit rein
//Falls jemand in der nachricht ein | verwendet hat sollten wir das //ersetzen, da sonst beim auslesen fehler auftauchen $_POST['myGBtext'] = str_replace("|","<!strich!>",$_POST['myGBtext']); //Und dann noch die Zeilenumbrüche raus damit alles in einer Reihe steht //ist kein muss, sieht aber besser aus $_POST['myGBtext'] = str_replace("\r\n","<!umbruch!>",$_POST['myGBtext']);
$GBeintrag .= $_POST['myGBtext']."\r\n";
//Den eintrag in die Textdatei schreiben $openfile = fopen("myGB.txt","a"); fwrite($openfile,$GBeintrag); flock($openfile,2); fclose($openfile); flock($openfile,3); }
//Hier das Gästebuch öffnen und alle Einträge einlesen
$eintraege = @file("myGB.txt"); ?>
<!-- Hier der Allgemein bekannte HTML-Teil welcher das Aussehen der Seite und damit das des GBs bestimmt Hier kann man nach belieben alles anpassen bis auf Bestehen bleiben sollten jedoch die integrierten PHP-Anweisungen welche sich zwichschen <? //und ?> befinden. Sebstverständlich können diese natürlich an eine andere Stelle verfrachtet werden. //-->
<!-- EINTRÄGE ANZEIGEN --> <? //PHP-code um die Einträge anzuzeigen
//solange einträge vorhanden sind wird eine schleife durchlaufen //von hinten nach vorne (also neueste zuerst) for($a = (count($eintraege) - 1); $a > -1; $a--) { //Die einzelnen Teile des Eintrags teilen $Eintrag = explode("|",$eintraege[$a]);
//Dann noch die Sonderstrings wie "<!umbruch!>" und "<!strich!>" wieder //in die ursprünglichen zeichen ersetzen $Eintrag[4] = str_replace("<!umbruch!>","\r\n",$Eintrag[4]); $Eintrag[4] = str_replace("<!strich!>","|",$Eintrag[4]);
Die Abfrage, ob die Dateigröße > 0 ist, kann man sich sparen. Wenn man (wie im jetzigen Skript) die Datei zeilenweise mit file(...) einliest, erhält man automatisch das Array mit den Einträgen, und das hat im Falle von NULL Einträgen auch die Länge NULL, weswegen die FOR-Schleife bei der Ausgabe dann auch gar nicht erst durchlaufen wird. Die Textdatei muss zu Beginn auch nicht vorhanden sein - beim ersten Eintrag wird sie automatisch angelegt. Damit aber beim ersten Auslesen (keine Einträge vorhanden) keine Fehlermeldung kommt, wird ein "@" vor die Funktion file() geschrieben. Bei der Ausgabe der Nachricht kam noch ein "nl2br" dazu, sonst werden ja keine Umbrüche dargestellt
Würde aber sagen, dass hier ein schönes kompaktes und einfach zu implementierendes Gästebuch entstanden ist
greez JoSsiF
-------------- EDIT: schnell noch die Änderung von Mario mit aufgenommen
« Letzte Änderung: 17.05.05, 14:03:21 von JoSsiF »
So, und jetzt auch mit einzelnen Seiten. Sieht noch nicht sonderlich gut aus, funktioniert aber erstmal. Ich denk mal, ich bastel noch n bissel weiter. Marios und JoSsiFs Änderungen sind auch mit drin.
Cooles Ding entstanden. Können wir fast n bissel wie stolz sein
Code:
<?
//Der PHP-Teil. Ohne PHP (oder einer anderen Internettauglichen //Programmiersprache (wie z.B. Perl)) wird man kein Gästebuch zum //Laufen bekommen.
//Script wird nur ausgeführt wenn der Benutzer auf "Eintragen" gedrückt hat if($_POST['submit']) { //Alles in eine Variable hintereinander schreiben $GBeintrag = $_POST['myGBname']."|"; $GBeintrag .= $_POST['myGBhp']."|"; $GBeintrag .= $_POST['myGBmail']."|"; $GBeintrag .= date("d.m.y")."|"; //datum muss natürlich auch mit rein
//Falls jemand in der nachricht ein | verwendet hat sollten wir das //ersetzen, da sonst beim auslesen fehler auftauchen $_POST['myGBtext'] = str_replace("|","<!strich!>",$_POST['myGBtext']); //Und dann noch die Zeilenumbrüche raus damit alles in einer Reihe steht //ist kein muss, sieht aber besser aus $_POST['myGBtext'] = str_replace("\r\n","<!umbruch!>",$_POST['myGBtext']);
$GBeintrag .= $_POST['myGBtext']."\r\n";
//Den eintrag in die Textdatei schreiben $openfile = fopen("myGB.txt","a"); fwrite($openfile,$GBeintrag); flock($openfile,2); fclose($openfile); flock($openfile,3); }
//Hier das Gästebuch öffnen und alle Einträge einlesen
$eintraege = @file("myGB.txt");
//Die Variable $ppp steht für Posts-Per-Page und gibt an, //wieviele Beiträge auf einer Seite angezeigt werden sollen $ppp = 5; ?>
<!-- Hier der Allgemein bekannte HTML-Teil welcher das Aussehen der Seite und damit das des GBs bestimmt Hier kann man nach belieben alles anpassen bis auf Bestehen bleiben sollten jedoch die integrierten PHP-Anweisungen welche sich zwichschen <? //und ?> befinden. Sebstverständlich können diese natürlich an eine andere Stelle verfrachtet werden. //-->
<!-- EINTRÄGE ANZEIGEN --> <? //PHP-code um die Einträge anzuzeigen
//solange einträge vorhanden sind wird eine schleife durchlaufen //von hinten nach vorne (also neueste zuerst) $start = (count($eintraege)-2) - $ppp*$page; $stop = (count($eintraege)-2) - $ppp*$page - $ppp + 1; if($stop<0) $stop = 0; for($a = $start; $a >= $stop; $a--) { //Die einzelnen Teile des Eintrags teilen $Eintrag = explode("|",$eintraege[$a]);
//Dann noch die Sonderstrings wie "<!umbruch!>" und "<!strich!>" wieder //in die ursprünglichen zeichen ersetzen $Eintrag[4] = str_replace("<!umbruch!>","\r\n",$Eintrag[4]); $Eintrag[4] = str_replace("<!strich!>","|",$Eintrag[4]);
//und jetzt alles in tabellen ausgeben ?> <table class="GBtable"> <tr class="GBhead"> <td>Von : <?=$Eintrag[0];?></td> <td>am : <?=$Eintrag[3];?></td> <td><a class="GBlink" href="mailto:<?=$Eintrag[2];?>">Email</a></td> <td><a class="GBlink" href="<?=$Eintrag[1];?>" target="_blank">Homepage</td> </tr> <tr> <td colspan="4"><?=nl2br($Eintrag[4]);?></td> </tr> </table> <br> <? } //$max gibt die Anzahl der Einträge an $max = count($eintraege)-1; echo("<p align='center'>"); //ist man nicht auf Seite 0 kann man logischerweise eine Seite zurückgehen if(($max > $ppp)&&($page>0)) echo("<a href='index.php?page=".($page-1)."'>vorherige Seite</a>"); echo(" Seite ".$page." "); //und ist die Anzahl der Einträge größer, als die, die von der aktuellen //Seite dargestellt wird, kann man eine Seite vorgehen if(($max > $ppp)&&($max>($page+1)*$ppp)) echo("<a href='index.php?page=".($page+1)."'>nächste Seite</a>"); echo("</p>"); ?> </center>
</body> </html>
Hier noch n paar Anmerkungen:
In Zeile 39 wird durch $ppp (posts-per-page ) gesagt, wieviele Posts pro Seite angezeigt werden. Und die Datei muss index.php heissen, wegens den Zeilen 151 und 155 mit:
Funzt glaub ich noch nich so supi mit den Seiten, aber ich schau ma rein...
Die Datei muss übrigens nicht zwingend index.php heißen. Du kannst den Link auch mittels der Superglobal $PHP_SELF setzen (mach ich gleich noch mit rein).