 | |
21.07.2008, 12:23
| Nach oben
#1 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
| Frage zu Tutorial (Gästebuch auf Textdatei basierend)
Guten Morgen alle zusammen (wenn man noch von Morgen sprechen kann  )!!
Ich habe hier ein tolles PHP-Tutorial gefunden, mit dem man ein Gästebuch erstellen kann, was auf keiner normalen Datenbank basiert, sondern wo die Einträge in einer TXT-Datei gespeichert werden.
Hier der Link zum Tutorial: http://www.developers-guide.net/foru...atei-basierend
Ich hab das zum Teil übernommen, zum Teil verändert und zum Teil auch neue Dinge hinzugefügt, wie zum Beispiel ein relativ kompliziertes, dafür jedoch sehr gutes Captcha. Hier findet ihr mein aktuelles Gästebuch (eher eine Test-Version http://www.schueler-gegen-mobbing.de/gb/gb2.php
Ich habe jedoch eine sehr wichtige Frage. Es klappt ja alles ganz gut, allerdings möchte ich auch gerne Absätze in meine Einträge einfügen. Wenn ich jetzt Absätze mache, alle anderen Felder ausfülle und auf Absenden klicke, wird nur der erste Absatz übernommen. Warum? Der ganze Eintrag wird in der Variable $eintrag gespeichert. Diese wird, so wie sie ist, in die gaestebuch.txt Datei eingelagert (Die befindet sich im gleichen Verzeichnis, könnt ihr also auch aufrufen). Probiert doch mal aus, einen Beitrag mit Absätzen zu machen, wenn ihr die TXT-Datei seht, dann wisst ihr auch, warum das nicht geht: Der erste Absatz ist (logischer Weise) in der Reihe, in der sich auch Datum, Uhrzeit, Name usw. befinden. Anschließend kommt eine leere Zeile und dann beginnt der zweite Absatz. Eigentlich sollte jedoch pro Zeile ein Eintrag stehen.
Ich hoffe, ihr wisst, was ich meine. Wenn nicht, dann fragt einfach  Ich brauche jetzt eine Lösung für das Problem. Gibt es die Möglichkeit, die Einträge so zu speichern, dass sie zwar in der TXT-Datei in einer Reihe erscheinen, jedoch später wieder richtig ausgegeben werden? Muss man da HTML-Tags hinzufügen, die einen Zeilenumbruch erzeugen? Oder wird dieser dann einfach nur ausgegeben, allerdings nicht umgesetzt?
Sorry wegen der vielen Fragen
Achja, @Jann Hendrik, danke für die Antwort, vielleicht lässt sich das ja wirklich übernehmen!
Liebe Grüße,
Alex
|
| |
21.07.2008, 12:45
| Nach oben
#2 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Noch ne Kleinigkeit:
In dem Tutorial wurde in einem folgenden Beitrag das Problem angesprochen, was passiert, wenn man || eintippt. Also das ist zwar sehr wahrscheinlich, man kann das aber einfach ändern, in dem man sich ein anderes Zeichen überlegt. Z.B.: <> oder ## oder °° usw. Es können ja auch mehr als zwei Zeichen sein, aber eigentlich sind die ja zum Trennen da |
| |
21.07.2008, 12:46
| Nach oben
#3 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
Also ... das Problem ist, dass in der Datei der Zeilenumbruch direkt als Zeichen gespeichert wird.
Beim Auslesen wird aber zeilenweise vorgegangen, daher erscheint auch nur die eine Zeile.
Was du also machen muss ist das Zeichen durch eine Zeichenfolge deiner Wahl ersetzen (vor dem speichern).
Nach dem Speichern musst du dann die Zeichenfolge wieder durch ein <br> ersetzen, damit du dann den Zeilenumbruch dargestellt bekommst. Zitat:
Zitat von sgmalex In dem Tutorial wurde in einem folgenden Beitrag das Problem angesprochen, was passiert, wenn man || eintippt. Also das ist zwar sehr wahrscheinlich, man kann das aber einfach ändern, in dem man sich ein anderes Zeichen überlegt. Z.B.: <> oder ## oder °° usw. Es können ja auch mehr als zwei Zeichen sein, aber eigentlich sind die ja zum Trennen da  | Das ist richtig. Du kannst da auch dreißig Zeichen für nutzen....
|
| |
21.07.2008, 12:49
| Nach oben
#4 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Verstehe... Aber wie genau setzt man das um?
|
| |
21.07.2008, 13:43
| Nach oben
#5 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Noch ne Frage: Irgendwie werden Umlaute und ß nicht mehr richtig angezeigt, ich weiß aber nicht, woran das liegt. Am Anfang ging es, jetzt nicht mehr (seht ihr ja selber, in den ersten beiden Einträgen sind Umlaute ganz normal dargestellt, in den letzten beiden nicht mehr). Ich habe es schon mit htmlentities() versucht...
Geändert von sgmalex (21.07.2008 um 15:14 Uhr).
|
| |
21.07.2008, 14:54
| Nach oben
#6 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Ich glaub ich blick grad ein bisschen durch^^ Was du also machen muss ist das Zeichen
Code:
\r\n
durch eine Zeichenfolge deiner Wahl ersetzen (vor dem speichern).
Macht man das mit str_replace()?
Ich habe damit mal ein bisschen rumgespielt, wenn man jetzt jedoch einen Absatz macht, wird <br /> angezeigt, allerdings nicht umgesetzt...
Geändert von sgmalex (21.07.2008 um 15:14 Uhr).
|
| |
21.07.2008, 15:01
| Nach oben
#7 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
ja... nun hast du es selbst rausgefunden
str_replace ist eine Möglichkeit.
Damit kannst du auch äöüß in die HTML-entities übersetzen.
|
| |
21.07.2008, 15:30
| Nach oben
#8 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Oh mist, jetzt geht gar nichts mehr...
Also das mit den äöüß hat ich schon ausprobiert, ging eigentlich nicht. Bei den Absätzen... Hat sich leider auch das \r\n in der TXT-Datei aufgelöst, wodurch alle nachfolgenden Einträge in einer Zeile stehen und man leider nicht mehr neue Einträge sieht. Ich poste mal das, was ich hab, um euch zu zeigen, wie mein Code aussieht. Vielleicht findet ihr ja den Fehler.
|
| |
21.07.2008, 15:50
| Nach oben
#9 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
| PHP-Code: <?php require_once("recaptchalib.php"); // Der Name der Gästebuch-Datei lautet: $datenbankdatei = 'gaestebuch.txt'; $mailempfaenger = 'alex.webmaster.sgm@gmail.com';
# the response from reCAPTCHA $resp = null; # the error code from reCAPTCHA, if any $error = null; // Überprüfung, ob die Datei vorhanden ist. // wenn nicht vorhanden, dann versuche diese zu erstellen // wenn das Erstellen nicht erfolgreich war (mangelnde Rechte), dann Skript abbrechen if(!file_exists($datenbankdatei)) if(!@touch($datenbankdatei)) die("Fehler: Die Datenbank ist nicht erreichbar.");
if(isset($_POST['button'])) {
// wenn das Formular abgeschickt wurde, dann führe das hier aus (Daten in die Datei eintragen) // Überprüfe, ob Name und Text angegeben wurde - sonst kein Eintrag if($_POST['name'] == "" || $_POST['email'] == "" || $_POST['eintrag'] == "") { echo 'Es fehlen Angaben. Bitte vollständig ausfüllen.'; } else { // Überprüfe, ob Captcha richtig eingegeben wurde $privatekey = "6LePhgIAAAAAAOHiXY91Kc5tqdpBRqZew541fdKu"; $resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); if (!$resp->is_valid) { die ("Sicherheitscode nicht korrekt. " . "(Fehler: " . $resp->error . ")"); } else {
// als erstes werden die Daten zu einem langen string zusammengefasst. Damit die einzelnen Variablen später wieder getrennt werden können setzen wir ein Trennzeichen. In diesem Fall habe ich mich für || entschieden. // das \n am Ende sorgt dafür, dass ein Zeilenumbruch in der Textdatei gemacht wird. Das ist für das Auslesen wichtig! $eintrag = date('d.m.Y - H:i:s').' || '.$_SERVER["REMOTE_ADDR"].' || '.$_POST['name'].' || '.$_POST['email'].' || '.$_POST['site'].' || '.$_POST['eintrag']."\r\n";
// Nun wird die Datei geöffnet. Der Modus 'a' gibt an, dass die Datei zum Schreiben geöffnet wurde und die Daten hinten dran gehängt werden $file = fopen($datenbankdatei,"a"); // Absätze ermöglichen
$from = array("Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "\n"); $to = array("Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "<br />"); $eintrag = str_replace("$from", "$to", "$eintrag");
// mit fwrite werden nun die Daten, welche wir vorher zu einer Variable zusammengefasst haben hineingeschrieben fwrite($file, $eintrag);
// Datei schliessen fclose($file);
// Ausgabe für den User: echo '<h2>Danke '.$_POST['name'].' für Ihren Eintrag!</h2>Die Daten wurden erfolgreich aufgenommen.<br /><a href="'.$_SERVER["PHP_SELF"].'">Zurück zum Gästebuch</a>'; // eMail wird verschickt: @mail($mailempfaenger, "Gästebucheintrag", "Folgender Eintrag wurde hinterlassen:\r\n\r\nName: ".$_POST['name']."\r\nEMail: ".$_POST['email']."\r\nWebsite: ".$_POST['site']."\r\nText: ".$_POST['eintrag']."\r\nIP: ".$_SERVER["REMOTE_ADDR"]."\r\n".date('d.m.Y - H:i:s'), "From: ".$_POST['email']."\r\nX-Mailer: PHP/" . phpversion()); } } } else { // wenn das Formular nicht ausgefüllt wurde, es also nur einfach angezeigt werden soll, dann führe diesen Teil aus:
// Anzeige der Einträge aus dem Gästebuch: echo '<h2>Mein Gästebuch</h2>';
// Öffnen der Datei im Lese-Modus: $file = fopen($datenbankdatei, 'r');
// Solange wiederholen, bis die Datei vollständig ausgelesen wurde while (!feof($file)) { // Zeile für Zeile auslesen: $zeile = fgets($file, 5000); $daten = explode(" || ", $zeile); $datum = $daten[0]; $ip = $daten[1]; $name = $daten[2]; $email = $daten[3]; $site = $daten[4]; $eintrag = $daten[5];
// Ausgabe auf den Bildschirm:
if($name != "" && $eintrag != "") { if ($site == "http://" OR $site == "") { echo '<u>'.htmlentities($name, ENT_NOQUOTES).' schrieb am '.$datum.' folgendes:</u><br />'.htmlentities($eintrag, ENT_NOQUOTES).'<br /><br />'; } else { echo '<u><a href="'.$site.'">'.htmlentities($name, ENT_NOQUOTES).'</a> schrieb am '.$datum.' folgendes:</u><br />'.htmlentities($eintrag, ENT_NOQUOTES).'<br /><br />'; } } } fclose($file);
// Trennlinie zwischen alten Einträgen und dem Formular: echo '<hr />';
// Formular für weitere Einträge: echo '<h2>Neue Einträge:</h2> <p>Daten mit * müssen angegeben werden.</p> <form method="post" action="'.$_SERVER["PHP_SELF"].'"> <table> <tr> <td>*</td><td width="100"><p>Ihr Name:</p></td><td><input type="text" name="name"></td> </tr> <tr> <td>*</td><td><p>Ihre EMail:</p></td><td><input type="text" name="email"></td> </tr> <tr> <td></td><td><p>Ihre Website:</p></td><td><input type="text" name="site" value="http://" /></td> </tr> <tr> <td>*</td><td><p>Ihr Eintrag:</p></td><td><textarea name="eintrag" cols="45" rows="7"></textarea></td> </tr> <tr> <td>*</td><td>Sicherheitscode:</td><td>'; $publickey = "6LePhgIAAAAAAOIHfNA2FO-pRjqi1roMCco1O45B"; echo '<script> var RecaptchaOptions = { lang : \'de\', theme : \'clean\' }; </script>'; $privatekey = "6LePhgIAAAAAAOHiXY91Kc5tqdpBRqZew541fdKu"; echo recaptcha_get_html($publickey); echo '</td> </tr> <tr> <td></td><td><input type="submit" name="button" value="Absenden"></td><td></td> </tr> </table> </form>'; } ?>
Geändert von sgmalex (22.07.2008 um 15:22 Uhr).
|
| |
22.07.2008, 09:51
| Nach oben
#11 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
Der Unterschied dürfte sich dadurch erklären, dass du \r\n als Steuerzeichen dort einbaust und damit dann auch in der Text-Datei für einen Zeilenumbruch sorgst...
Das kann man zwar auch umgehen, indem man das nicht in " sondern in ' umhüllt, aber ... du kannst anstelle der Zeichenfolge auch mal was anderes nehmen...
Nimm mal als Zeichenfolge für den Zeilenumbruch, die du dir in der Datei speicherst gleich <br>, das hat den Vorteil, dass du das zum Auslesen nicht nochmal ändern musst.
|
| |
22.07.2008, 15:21
| Nach oben
#12 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Geht leider auch nicht. Ich habe den aktuellen Code jetzt oben aktualisiert.
|
| |
22.07.2008, 16:09
| Nach oben
#13 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
\n
\r
\n\r
\t
das sind alles reservierte Zeichen, die du dafür nicht nehmen solltest.
Nimm einfach mal direkt <br>
|
| |
22.07.2008, 23:14
| Nach oben
#14 | | Neuer Benutzer
Registriert seit: 21.07.2008
Beiträge: 17
|
Hab es nochmal versucht, weiß aber nicht, ob ich das gleiche gemacht habe, wie du es meinst. Vielleicht solltest du nochmal konkret angeben, wo genau was geändert werden muss. PHP-Code: <?php require_once("recaptchalib.php"); // Der Name der Gästebuch-Datei lautet: $datenbankdatei = 'gaestebuch.txt'; $mailempfaenger = 'alex.webmaster.sgm@gmail.com';
# the response from reCAPTCHA $resp = null; # the error code from reCAPTCHA, if any $error = null; // Überprüfung, ob die Datei vorhanden ist. // wenn nicht vorhanden, dann versuche diese zu erstellen // wenn das Erstellen nicht erfolgreich war (mangelnde Rechte), dann Skript abbrechen if(!file_exists($datenbankdatei)) if(!@touch($datenbankdatei)) die("Fehler: Die Datenbank ist nicht erreichbar.");
if(isset($_POST['button'])) {
// wenn das Formular abgeschickt wurde, dann führe das hier aus (Daten in die Datei eintragen) // Überprüfe, ob Name und Text angegeben wurde - sonst kein Eintrag if($_POST['name'] == "" || $_POST['email'] == "" || $_POST['eintrag'] == "") { echo 'Es fehlen Angaben. Bitte vollständig ausfüllen.'; } else { // Überprüfe, ob Captcha richtig eingegeben wurde $privatekey = "6LePhgIAAAAAAOHiXY91Kc5tqdpBRqZew541fdKu"; $resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); if (!$resp->is_valid) { die ("Sicherheitscode nicht korrekt. " . "(Fehler: " . $resp->error . ")"); } else {
// als erstes werden die Daten zu einem langen string zusammengefasst. Damit die einzelnen Variablen später wieder getrennt werden können setzen wir ein Trennzeichen. In diesem Fall habe ich mich für || entschieden. // das \n am Ende sorgt dafür, dass ein Zeilenumbruch in der Textdatei gemacht wird. Das ist für das Auslesen wichtig! $eintrag = date('d.m.Y - H:i:s').' || '.$_SERVER["REMOTE_ADDR"].' || '.$_POST['name'].' || '.$_POST['email'].' || '.$_POST['site'].' || '.$_POST['eintrag']."\r\n";
// Nun wird die Datei geöffnet. Der Modus 'a' gibt an, dass die Datei zum Schreiben geöffnet wurde und die Daten hinten dran gehängt werden $file = fopen($datenbankdatei,"a"); // Absätze ermöglichen
$from = array("Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "<br />"); $to = array("Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "<br />"); $eintrag = str_replace("$from", "$to", "$eintrag");
// mit fwrite werden nun die Daten, welche wir vorher zu einer Variable zusammengefasst haben hineingeschrieben fwrite($file, $eintrag);
// Datei schliessen fclose($file);
// Ausgabe für den User: echo '<h2>Danke '.$_POST['name'].' für Ihren Eintrag!</h2>Die Daten wurden erfolgreich aufgenommen.<br /><a href="'.$_SERVER["PHP_SELF"].'">Zurück zum Gästebuch</a>'; // eMail wird verschickt: @mail($mailempfaenger, "Gästebucheintrag", "Folgender Eintrag wurde hinterlassen:\r\n\r\nName: ".$_POST['name']."\r\nEMail: ".$_POST['email']."\r\nWebsite: ".$_POST['site']."\r\nText: ".$_POST['eintrag']."\r\nIP: ".$_SERVER["REMOTE_ADDR"]."\r\n".date('d.m.Y - H:i:s'), "From: ".$_POST['email']."\r\nX-Mailer: PHP/" . phpversion()); } } } else { // wenn das Formular nicht ausgefüllt wurde, es also nur einfach angezeigt werden soll, dann führe diesen Teil aus:
// Anzeige der Einträge aus dem Gästebuch: echo '<h2>Mein Gästebuch</h2>';
// Öffnen der Datei im Lese-Modus: $file = fopen($datenbankdatei, 'r');
// Solange wiederholen, bis die Datei vollständig ausgelesen wurde while (!feof($file)) { // Zeile für Zeile auslesen: $zeile = fgets($file, 5000); $daten = explode(" || ", $zeile); $datum = $daten[0]; $ip = $daten[1]; $name = $daten[2]; $email = $daten[3]; $site = $daten[4]; $eintrag = $daten[5];
// Ausgabe auf den Bildschirm:
if($name != "" && $eintrag != "") { if ($site == "http://" OR $site == "") { echo '<u>'.htmlentities($name, ENT_NOQUOTES).' schrieb am '.$datum.' folgendes:</u><br />'.htmlentities($eintrag, ENT_NOQUOTES).'<br /><br />'; } else { echo '<u><a href="'.$site.'">'.htmlentities($name, ENT_NOQUOTES).'</a> schrieb am '.$datum.' folgendes:</u><br />'.htmlentities($eintrag, ENT_NOQUOTES).'<br /><br />'; } } } fclose($file);
// Trennlinie zwischen alten Einträgen und dem Formular: echo '<hr />';
// Formular für weitere Einträge: echo '<h2>Neue Einträge:</h2> <p>Daten mit * müssen angegeben werden.</p> <form method="post" action="'.$_SERVER["PHP_SELF"].'"> <table> <tr> <td>*</td><td width="100"><p>Ihr Name:</p></td><td><input type="text" name="name"></td> </tr> <tr> <td>*</td><td><p>Ihre EMail:</p></td><td><input type="text" name="email"></td> </tr> <tr> <td></td><td><p>Ihre Website:</p></td><td><input type="text" name="site" value="http://" /></td> </tr> <tr> <td>*</td><td><p>Ihr Eintrag:</p></td><td><textarea name="eintrag" cols="45" rows="7"></textarea></td> </tr> <tr> <td>*</td><td>Sicherheitscode:</td><td>'; $publickey = "6LePhgIAAAAAAOIHfNA2FO-pRjqi1roMCco1O45B"; echo '<script> var RecaptchaOptions = { lang : \'de\', theme : \'clean\' }; </script>'; $privatekey = "6LePhgIAAAAAAOHiXY91Kc5tqdpBRqZew541fdKu"; echo recaptcha_get_html($publickey); echo '</td> </tr> <tr> <td></td><td><input type="submit" name="button" value="Absenden"></td><td></td> </tr> </table> </form>'; } ?> |
| |
23.07.2008, 07:20
| Nach oben
#15 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
Versuch es mal so: PHP-Code: // Absätze ermöglichen
$from = array("Ä", "ä", "Ö", "ö", "Ü", "ü", "ß");
$to = array("Ä", "ä", "Ö", "ö", "Ü", | |