Habe Problem mit selbstgebasteltem Gästebuch
schmichl
- php
Hi Leute!
Ich habe angefangen, selbst ein Gästebuch zu Programmieren und hänge vor einem Problem. Man kann einen Namen, eine Mailadresse, eine Homepageadresse und natürlich eine Nachricht eingeben, die Mail- und HP adresse ist aber freiwillig. Die Emailadresse wird mithilfe eines Bildes (das ein Link ist, entweder mailto: oder target="_blank") dargestellt, die Homepageadresse genauso. Wenn jetzt jemand nur einen Namen und eine Nachricht eingibt, dann sollen diese Bilder natürlich nicht erscheinen. Weiß hier jemand eine Lösung?
Ich habe es einmal mit dem folgenden Script gelöst, aber das geht nicht ganz, später mehr dazu (die Variablen $nummer und $zeit sind die eintragsnummern und die eintragszeiten, das funktioniert alles, es steht ja an den ersten zwei Stellen). $url, $email, $message, und $name sind die namen der einzelnen Formularteile, also die eingegebenen Wörter.
Hier der Teil des Scriptes:
if(file_exists('gaestebuch.txt')){ $eintrag="\n";}
$comment=fopen('gaestebuch.txt','a');
if ($url == ""){ $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email;}
elseif ($email == ""){ $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email."~".$url;}
elseif ($url == "" AND $email == "") { $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message;}
else { $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email."~".$url; }
fputs($comment,$eintrag);
fclose($comment);
echo "Danke <i>$name</i> für deinen Eintrag!<br>";
unset($name);
unset($message);
unset($email);
unset($url);
}
//Auslesen der Einträge in Tabellen:
$auslesen=file('gaestebuch.txt');
$eintrag="<br>";
$temp=count($auslesen)-1;
for($i=$temp;$i>=0;$i--)
{
$element=explode('~',$auslesen[$i]);
$auswertung=count($element);
if($auswertung == "5" AND $element[4] == ""){
$eintrag.="<table border="0" cellspacing=0 class="eintrag">";
$eintrag.="<tr bgcolor="#FFFFFF"><td colspan=2>".$element[2]."</td></tr>";
$eintrag.="<tr><td colspan=2>".$element[3]."<br></td></tr>";
$eintrag.="<tr bgcolor="#FFFFFF" class="details"><td align="left">Eintrag Nummer: $element[0]</td><td align="right">Eingetragen am: $element[1]</td></tr>";
$eintrag.="</table><br>";
$eintrag=stripslashes($eintrag);}
elseif($auswertung == "5" AND $element[4] != ""){
$eintrag.="<table border="0" cellspacing=0 class="eintrag">";
$eintrag.="<tr bgcolor="#FFFFFF"><td>".$element[2]."</td><td align="right"><a href="mailto:$element[4]"><img src="mail.gif" class="hpem"></a></td></tr>";
$eintrag.="<tr><td colspan=2>".$element[3]."<br></td></tr>";
$eintrag.="<tr bgcolor="#FFFFFF" class="details"><td align="left">Eintrag Nummer: $element[0]</td><td align="right">Eingetragen am: $element[1]</td></tr>";
$eintrag.="</table><br>";
$eintrag=stripslashes($eintrag);}
elseif($auswertung == "6" AND $element[4] == ""){
$eintrag.="<table border="0" cellspacing=0 class="eintrag">";
$eintrag.="<tr bgcolor="#FFFFFF"><td>".$element[2]."</td><td align="right"><a href="$element[5]" target=_blank><img src="www.gif" class="hpem"></a></td></tr>";
$eintrag.="<tr><td colspan=2>".$element[3]."<br></td></tr>";
$eintrag.="<tr bgcolor="#FFFFFF" class="details"><td align="left">Eintrag Nummer: $element[0]</td><td align="right">Eingetragen am: $element[1]</td></tr>";
$eintrag.="</table><br>";
$eintrag=stripslashes($eintrag);}
elseif
($auswertung == "6"){
$eintrag.="<table bgcolor="#CCCCCC" border="0" cellspacing=0 class="eintrag">";
$eintrag.="<tr bgcolor="#FFFFFF"><td>".$element[2]."</td><td align="right"><a href="mailto:$element[4]"><img src="mail.gif" class="hpem"></a>
<a href="$element[5]" target=_blank><img src="www.gif" class="hpem"></a></td></tr>";
$eintrag.="<tr><td colspan=2>".$element[3]."<br></td></tr>";
$eintrag.="<tr bgcolor="#FFFFFF" class="details"><td align="left">Eintrag Nummer: $element[0]</td><td align="right">Eingetragen am: $element[1]</td></tr>";
$eintrag.="</table><br>";
$eintrag=stripslashes($eintrag);}
}//Endeklammer for Schleife
So, Problem Nummer eins ist einmal, das wenn man nur Name und Text eingibt, der Eintrag in die Textdatei zB so aussieht: 3~10.8.2004~Name~Testnachricht~
Also eine Tilde zuviel.
Ich habe die Elemente des mit file() ausgelesenen Arrays gezählt, wenn also 5 Elemente sind, und das letzte leer ist, dann wird die Eintragstabelle ohne dem Email und HP Link geschrieben. Das funktioniert auch, aber wenn ich dann nocheinmal dasselbe mache, wird bei dem vorigen Eintrag ein Email-Link gemacht.
Warum????????
Schaut es euch einmal persöhnlich an:
http://miha.serverspeed.org/tegstbook/guestbook.php
Ich hoffe es hat mich jemand verstanden und kann mir helfen!
MfG,
schmichl
Hallo schmichl!
Hast Du schonmal was von $_GET und $_POST gehört?
Falls nein, schau doch mal bei http://de3.php.net/manual/en/language.variables.predefined.php vorbei. Für mehr Infos siehe Archiv oder suche mit Deine bevorzugten Suchmaschine.
So, Problem Nummer eins ist einmal, das wenn man nur Name und Text eingibt, der Eintrag in die Textdatei zB so aussieht: 3~10.8.2004~Name~Testnachricht~
Also eine Tilde zuviel.
Dann entferne diese Tilde doch einfach bzw. schreib sie gar nicht erst.
[...] Das funktioniert auch, aber wenn ich dann nocheinmal dasselbe mache, wird bei dem vorigen Eintrag ein Email-Link gemacht.
Hä? 2 mal die selbe Aktion auf den selben Datensatz ergibt 2 verschiedene Ergebnisse?
Prüf doch einfach, unabhängig von irgendwelchen Zählaktionen, ob die einträge für Homepage oder E-Mail leer sind, und wenn sie leer sind, stelle kein Bild dar. Fertig.
MfG
Götz
Hi Götz!
Dann entferne diese Tilde doch einfach bzw. schreib sie gar nicht erst.
Die mache ich gar nicht, die macht sich von selbst in die Datei!
[...] Das funktioniert auch, aber wenn ich dann nocheinmal dasselbe mache, wird bei dem vorigen Eintrag ein Email-Link gemacht.
Hä? 2 mal die selbe Aktion auf den selben Datensatz ergibt 2 verschiedene Ergebnisse?
Nein, ich meine, wenn ich dann nochmals so einen Eintrag ohne Email und www adresse schreibe!
Noch eine Frage, kann ich auch zB nach 10 Einträgen eine Neue (meinetwegen HTML( Seite machen, in welche dann die nächsten 10 Einträge geschrieben werden, weil dann kann man ganz unten zwischen verschiedenen Eintragsseiten herumsurfen und muss nicht 100 einträge nach unten scrollen. Geht das auch mit Textdatein?
Ich weiß nur, das sowas mit MySQL geht, und dass das fast jedes gute Gästebuch hat.
MfG,
schmichl
Hallo schmichl!
Die mache ich gar nicht, die macht sich von selbst in die Datei!
Da Du das Script selbst geschrieben hast, muß ich Dir hier widersprechen.
Du sagst dem Script ja schließlich, was wann wohin geschrieben wird.
Noch eine Frage, kann ich auch zB nach 10 Einträgen eine Neue [...]
Du liest einfach nur die ersten 10 Zeilen ein, bzw. die zweiten 10 usw. ...
Ich würde Dir auch noch vorschlagen, Dein Speicherformat noch einmal zu überdenken.
Als Alternative zu Deinem Tilden-Salat würde ich Dir zu ner CSV-Datei (siehe auch http://de2.php.net/manual/en/function.fgetcsv.php) oder auch einem serialisierten Array (siehe auch http://de3.php.net/serialize) raten.
MfG
Götz
hi,
Dann entferne diese Tilde doch einfach bzw. schreib sie gar nicht erst.
Die mache ich gar nicht, die macht sich von selbst in die Datei!
$element=explode('~',$auslesen[$i]);
hast du überhaupt den hauch einer ahnung, was dein script macht, oder ist das nur per c&p "programmiert"?
gruß,
wahsaga
hi,
$element=explode('~',$auslesen[$i]);
sorry, das war das auslesen.
für das erzeugen der tilde ist natürlich folgende stelle verantwortlich:
if ($url == ""){ $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email;}
elseif ($email == ""){ $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email."~".$url;}
elseif ($url == "" AND $email == "") { $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message;}
else { $eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email."~".$url; }
gruß,
wahsaga
Hallo,
ich habe auch mal ein ziemlich gutes GB mit PHP gemacht - allerdings mit MySQL, würde ich dir auch empfehlen.
Da war es ganz einfach mit diesen Bildchen. Wenn es so bei dem .txt file GB nicht funktioniert dann machs doch n bissl anders. Schon beim eintragen schaust du pb jemand bei den entsprechenden feldern was reingeschireben hat und schreibst wenn nichts drinnen ist z.B NO_WWW oder NO_EMAIL und dann in der anzeige if abfrage
if ($url = "NO_WWW") keinbild....
müsste eigendlich gehen
mfg
Alex
Hello Schmichl,
ich habe die Diskussion hier ein wenig verfolgt.
Deinen Code habe ich natürlich auch angeschaut.
Einige Tips hast Du ja auch schon bekommen.
Wie wäre es, das Gästebuch nochmals zusammen neu aufzubauen, Schritt für Schritt, sodaß Du verstehen kannst, wie es funktioniert?
Dann solltest Du als erstes mal definieren, was Dien Gästebuch alles können soll.
Welche Bildschirme (Views) gibt es?
Welche Buttons werden da in Gesamtheit benötigt?
Welche Berechtungsstufen/-klassen gibt es
Welche Elemente sind in welchem View für welche Berchtigungen sichtbar, benutzbar?
Wie strukturiert man Daten?
Wie übernimmt man POST-/ GET-Daten?
Wie prüft man Daten?
Was ist das Raw-Format für Daten?
Was ist File Locking und warum benötigt man es?
Wenn es Dich also interessiert, dann sollten wir einen Plan machen. ;-)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom!
Wie wäre es, das Gästebuch nochmals zusammen neu aufzubauen, Schritt für Schritt, sodaß Du verstehen kannst, wie es funktioniert?
Dann solltest Du als erstes mal definieren, was Dien Gästebuch alles können soll.
- Seitenweise Anzeige mit jeweils n Datensätzen
- Eintragungsmöglichkeit für die Felder ...
- Bildupload
- Kommentar durch den Admin
- Sperren (Filtern) von Datensätzen
- Suchen von Datensätzen
- BB-Codes
Welche Bildschirme (Views) gibt es?
Welche Buttons werden da in Gesamtheit benötigt?
Welche Berechtungsstufen/-klassen gibt es
Welche Elemente sind in welchem View für welche Berchtigungen sichtbar, benutzbar?Wie strukturiert man Daten?
Wie übernimmt man POST-/ GET-Daten?
Wie prüft man Daten?
Was ist das Raw-Format für Daten?
Was ist File Locking und warum benötigt man es?
Danke für deine Ideen!
Ich bin leider noch eher Newbie in PHP, und würde mir genügen, wenn mein Gästebuch immer zB 10 Einträge pro Seite auflistet und man zwischen den Seiten blättern kann, weil das ist finde ich sehr wichtig!
Den BB-Code habe ich schon, das ist kein Besonderer, ich brauche auch nicht viel.
Eine Kommentarfunktion wäre nicht schlecht, aber die brauche ich eigentlich nicht!
Bildupload ist finde ich sowieso unnötig!
Was meinst du mit
- Sperren (Filtern) von Datensätzen
- Suchen von Datensätzen
????
MfG,
schmichl
Hello,
Danke für deine Ideen!
Ich bin leider noch eher Newbie in PHP, und würde mir genügen, wenn mein Gästebuch immer zB 10 Einträge pro Seite auflistet und man zwischen den Seiten blättern kann, weil das ist finde ich sehr wichtig!
Was meinst du mit
- Sperren (Filtern) von Datensätzen
- Suchen von Datensätzen
Wenn Dir ein Eintrag nicht gefällt, kannst Du ihn löschen, oder aber auch nur die Anzeige sperren. Und filtern heißt eben, dass man nach bestimmten Einträgen suchen kann, und die dann in einer Seite (oder mehreren) dargestellt werden.
Das Blättern geht eigentlich relativ einfach, wenn man sich die Daten vernünftig bindet. Das macht man ja üblicherweise in Datensätzen. Die stehen entweder immer in einem mehrdimensionalen Array, oder noch verpackt in einer Zeile einer CSV-Datei.
Wenn Du jetzt blättern willst, legst Du erstmal eine Konstante fest, die die Anzahl der datensätez pro Seite angibt.
Dann gibst Du mit dem Anzeigeformular ein hidden-Feld mit aus, das die Nummer der aktuellen Seite enthält. Das Formular enthält außerdem einen submit-Button für rückwärts blättern und einen für vorwärts blättern.
Im Modus "Anzeigen" fragst Du nun ab, welcher Button übertragen wurde:
<?php
## Post-Daten auswerten
if (isset($_POST['mode']) and ($_POST['mode'] == 'anzeigen'))
{
## Datei öffen
## Datei readlock (LOCK_SH)
## Anzahl der Datensätze ermitteln ggf. mittels Satzgröße, Dateigröße
## oder bei Textdateien durch vollständiges Einlesen
if (isset($_POST['btn']['next']))
{
if ($pageno < $maxpage) $pageno++;
}
elseif(isset($_POST['btn']['prev']))
{
if ($pageno > 1) $pageno--;
}
## Aus $rec_per_page und $pageno den Dateibereich bestimmen
## Alle Datensätze holen bei Textdateien
## Nur die gewünschten Datensätze holen bei Random Access Dateien
## Datei schließen und freigeben
## Aus $rec_per_page und $pageno ermittelten Dateibereich
## als HTML-String $showpage berechnen
}
?>
<form .....>
<?php $showpage; ?>
<input type="hidden" name="pageno" value="<?php echo $pageno; ?>">
<input type="hidden" name="mode" value="<?php echo $mode; ?>">
<input type="submit" name="btn[prev]" value="zurück">
<input type="submit" name="btn[next]" value="weiter">
</form>
Wie das nun genau umgesetzt werden muss, hängt von der Art der Datei ab. Wenn Du in Textdateien oder CSV-Dateien mit wahlfreier Satzlänge speicherst (spart Speicherplatz auf der Festplatte), dann musst Du die Datei immer von vorne und mindestens bis hinter die gewünschte Seite einlesen. Wenn Du auch die Anzahl der Datensätze wisen willst, die insgesamt drinstehen, dann wahrscheinlich sogar ganz. Wenn Du mit einer Random-Access-Datei arbeitest (feste Satzlänge), dann kannst Du gezielt die gewünschten Datensätze einlesen. Das geth erstens schneller, braucht zweitens weniger Arbeitsspeicher und benötigt aber leider drittens mehr Speicherplatz auf der Festplatte. Sie ist aber am ehesten vergleichbar mit der Funktionalität einer Datenbank, da man beliebig Saätze darin austauschen oder überschreiben kann, oder den INHALT des Platzes für den Satz löschen und zur wiederverwendung bereithalten.
Nähere Erläuterungen, wenn Du dich für eine Fileart entschieden hast.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi!
Danke mal für deine vielen Ideen!
Ich würde es eher mit Textdatein machen, die sind mir einfach sympathisch!
Das Codeschnipsel, welches du eben gezeigt hast, hab ich nicht so recht verstanden, aber egal.
Mittlerweile habe ich es geschafft, dass wenn jemand keine Mailadresse eingibt, auch kein Mail-Link kommt:
$eintragsdatei ="gaestebuch.txt";
if(file_exists($eintragsdatei)){ $eintrag="\n";}
$comment=fopen($eintragsdatei,'a');
if ($email!="") {$email="<a href="mailto:$email"><img src="mail.gif" class="hpem"></a>";}
if ($url!="") {$url="<a href="$url" target=_blank><img src="www.gif" class="hpem"></a>";}
$eintrag=$eintrag.$nummer."~".$zeit."~".$name."~".$message."~".$email."~".$url;
fputs($comment,$eintrag);
fclose($comment);
Ich schreibe einfach die kompletten HTML-Tags in die Datei, und wenn jemand keine hat, bleibt das Array-Element leer und es kann nichts ausgelesen werden. So habe ich mir auch viele Zeilen Script gepart!
MfG,
Michael