schmichl: Habe Problem mit selbstgebasteltem Gästebuch

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&uuml;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);

Keine Emailadresse und Homepageadresse, nur Name und Nachricht

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);}

Keine Homepageadresse aber Emailangabe

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);}

Keine Emailangabe aber Homepageadresse

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);}

Alle Angaben wurden gemacht

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>
&nbsp;<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

  1. 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?

    http://miha.serverspeed.org/tegstbook/guestbook.php

    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

    --
    Losung für Mittwoch, 11. August 2004
    Ich will euch ein neues Herz und einen neuen Geist in euch geben. (Hesekiel 36,26)
    Ist jemand in Christus, so ist er eine neue Kreatur; das Alte ist vergangen, siehe, Neues ist geworden. (2. Korinther 5,17)
    (http://www.losungen.de/heute.php3)
    1. 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

      1. 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

        --
        Losung für Mittwoch, 11. August 2004
        Ich will euch ein neues Herz und einen neuen Geist in euch geben. (Hesekiel 36,26)
        Ist jemand in Christus, so ist er eine neue Kreatur; das Alte ist vergangen, siehe, Neues ist geworden. (2. Korinther 5,17)
        (http://www.losungen.de/heute.php3)
      2. 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

        --
        "Look, that's why there's rules, understand? So that you can _think_ about them, before you break 'em."
        1. 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

          --
          "Look, that's why there's rules, understand? So that you can _think_ about them, before you break 'em."
  2. 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

  3. 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.

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

    Wenn es Dich also interessiert, dann sollten wir einen Plan machen. ;-)

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. 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

      1. 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&uuml;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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. 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