Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen
Thema geschlossen (topic locked)

Gästebuch

Hallo ich habe vor ein Gästebuch zu erstellen, das ganze klappt auch schon relativ gut. Es gibt keine Fehler im Programm allerdings wenn ich einen eintrag schreib wird der auch angezeigt wenn ich jetzt noch einen schreib wird der vorige gelöscht und nur der aktuellste angezeigt!?! Woran kann das liegen???

Quellcodes:

start.php:
<?php
echo"<html><head><title>Start</title></head><body bgcolor='#A56003'>";
echo"<p align='center'><font color='#FFFFFF'><span style='font-size: 20pt'>Gästebuch Version 0.1a</span></font></p>";
echo"<form method='GET' action='eintragen.php'>";
echo"<p>&nbsp;</p>";
echo"<p>&nbsp;</p>";
echo"<p><font color='#FFFFFF' style='font-size: 16pt'>Name:</font></p>";
echo"<p><font color='#FFFFFF'>";
   echo"<input type='input' name='namen' value=''></font></p>";   
   echo"<p><font color='#FFFFFF' style='font-size: 16pt'>email: </font></p>";
   echo"<p><font color='#FFFFFF'>";
   echo"<input type='input' name='mail' value=''>";
   echo"&nbsp;</font></p>";
   echo"<p align='left'>";
   echo"<font color='#FFFFFF'><span style='font-size: 16pt'>Ihr Text:</span></font></p>";

   echo"<p align='left'>";
         echo"<textarea name='text' rows='12' cols='107'>";
         echo"</textarea><br><br>";
echo"</p>";
      echo"<tr><td>&nbsp;</td><td><input type='submit' value='Abschicken'></td></tr>";
echo"</body>";
echo"</html>";
?>






eintragen.php:

<?php
   $dh=fopen("gbdok.txt","a");
   fwrite($dh,"$namen,$mail,$text\n");
   fclose($dh);
   echo"<table border=1 width='100%' height='30'><tr><th height='25' width='15%'>Name</th>";
   echo"<th height='30' width='15%'>email</th><th height='30'>Text</th></tr>";
   echo"<tr><td width='15%'>$namen </td><td width='15%'>$mail </td><td>$text</td></tr>";
   echo"</table>";

?>


« Letzte Änderung: 30.04.05, 17:01:05 von Syrus »

Antworten zu Gästebuch:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das liegt daran, dass Du die Textausgabe in der eintragen.php machst und die nur die Daten vom letzen Eintrag geliefert bekommt.
Ich würde eine etwas andere Architektur wählen.

start.php: Hier werden nur die Einträge angezeigt und ein Link zum Eintragen geliefert.

formular.php: Hier werden die Daten eingegeben und an eintragen.php weitervermittelt.

eintragen.php: Hier wird der Eintrag gespeichert.

Nun wirst Du aber nicht drumherum kommen, die Datei in der start.php auszulesen.

Bin gerade etwas in Eile, aber vielleicht denk ich mir ja morgen mal was aus, bzw. vielleicht hast Du's bis dahin ja auch schon  ;)

Gruß Spawn

Also irgendwie is des doof mit dem php entweder er überschreibt es oder er gibt nichts aus!
Ich hab des jetzt übrigens in 3 dateien unterteilt aber helfen tut das nicht wirklich!

Also es funktioniert soweit, dass der jetzt alles in dem .txt dokument abspeichert das einzige was ich noch brauche ist der befehl, dass der das da wieder rausliest!!!!


Ich hock jetzt seit 3 stunden dran und der scheiß läuft immer noch nich was muss denn in die datei rein die das auslesen soll??? eigentlich doch nur: datei öffnen, daten rauslesen, datei schließen, daten ausgeben oder sowas in der richtung also bei mir geht da gar nix mitlerweile gibt er ja nicht mal mehr was aus früher hat er immerhin noch das aktuellste rausgelesen

« Letzte Änderung: 01.05.05, 07:44:05 von Syrus »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das Problem an dem Code, den Du gepostet hast ist, dass Du die neuen Daten an die eintragen.php übermittelst und dann schreibst:

  echo"<table border=1 width='100%' height='30'><tr><th height='25' width='15%'>Name</th>";
   echo"<th height='30' width='15%'>email</th><th height='30'>Text</th></tr>";
   echo"<tr><td width='15%'>$namen </td><td width='15%'>$mail </td><td>$text</td></tr>";
   echo"</table>";
Die Daten werden zwar vorher korrekt in die Textdatei gespeichert, aber nur das eine übermittelte Ergebnis wird angezeigt.

Du solltest nur den Eintrag machen, die Daten aber nciht anhand dessen anzeigen sondern aus der Datei auslesen. Das funktioniert ähnlich fwrite, mit fread()

Eine Beschreibung findest Du zB hier:
http://de.php.net/manual/de/function.fread.php

Du könntest das in etwa so verwenden (ungetestet):
<?php
$handle 
fopen("gbdok.txt""r");
$contents '';
while (!
feof($handle)) {
  
$contents .= fread($handle8192);
}
fclose($handle);
?>

Dann würden alle Daten in der $contents gespeichert werden.
Blöderweise musst Du sie dann wieder auseinanderpflücken, da an Deinem Beispiel die komplette gbdok.txt in $contents gespeichert wird.
Dazu bräuchtest Du dann Stringmanipulationen (schau einfach mal auf oben genannte Seite, da gibts viele Referenzen).

Gruß Spawn

PS: Hast Du MySQL? Damit geht's auch und wahrscheinlich auch etwas einfacher.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Stimmt vollkommen: du solltest deine Textdatei in einem separaten Skript auslesen. Du musst in deinem Fall die Textdatei wieder zerhacken, um an die Daten zu kommen. Das könnte so aussehen:

<?
$entries = file("gbook.txt");
foreach($entries as $num => $content)
{
$this_entry = explode(",", $content);
echo($this_entry[0]."---".$this_entry[1]."---".$this_entry[2]."<br>");
}
?>

Würde dir aber auch zu MySQL raten, sofern verfügbar. Das ist schneller als die Verwendung von Textfiles, und die Handhabung der Daten wird einfacher.

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich habs jetzt auch nochmal mit Textdatei versucht und ein (einigermaßen gutes) Ergebnis bekommen. Hier erstmal der Code:

start.php

<?php
  
echo"<html><head><title>Start</title></head><body bgcolor='#A56003'>";
  echo
"<p align='center'><font color='#FFFFFF'><span style='font-size: 20pt'>Gästebuch Version 0.1a</span></font></p>";
  echo
"<table border=1 width='100%' height='30'>";
  echo
"<tr><th height='25' width='15%'>Name</th>";
  echo
"<th height='30' width='15%'>email</th><th height='30'>Text</th></tr>";
  
$handle fopen("gbdok.txt""r");
  while (!
feof($handle)) {
    
$name fgets($handle4096);
    
$email fgets($handle4096);
    
$text fgets($handle4096);
    echo
"<tr><td width='15%'>$name </td><td width='15%'>$email </td><td>$text</td></tr>";
  }
  
fclose($handle);
  echo
"</table>";
  echo(
"<a href='formular.php'>Neuer Eintrag</a>");
  echo
"</body>";
  echo
"</html>";
?>
formular.php
<?php
  
echo"<html><head><title>Formular</title></head><body bgcolor='#A56003'>";
  echo
"<form method='GET' action='eintragen.php'>";
  echo
"<p>&nbsp;</p>";
  echo
"<p>&nbsp;</p>";
  echo
"<p><font color='#FFFFFF' style='font-size: 16pt'>Name:</font></p>";
  echo
"<p><font color='#FFFFFF'>";
  echo
"<input type='input' name='namen' value=''></font></p>";
  echo
"<p><font color='#FFFFFF' style='font-size: 16pt'>email: </font></p>";
  echo
"<p><font color='#FFFFFF'>";
  echo
"<input type='input' name='mail' value=''>";
  echo
"&nbsp;</font></p>";
  echo
"<p align='left'>";
  echo
"<font color='#FFFFFF'><span style='font-size: 16pt'>Ihr Text:</span></font></p>";
  echo
"<p align='left'>";
  echo
"<textarea name='text' rows='12' cols='107'>";
  echo
"</textarea><br><br>";
  echo
"</p>";
  echo
"<tr><td>&nbsp;</td><td><input type='submit' value='Abschicken'></td></tr>";
  echo
"</body>";
  echo
"</html>";
?>
eintragen.php
<?php
  $dh
=fopen("gbdok.txt","a");
  
fwrite($dh,$namen."\n");
  
fwrite($dh,$mail."\n");
  
fwrite($dh,$text."\n");
  
fclose($dh);
  echo(
"<a href='start.php'> zur&uuml;eck zum Start</a>");
?>

In der eintragen.php wird jetzt nach jeder Variable (name, mail....) ein Zeilenumbruch gemacht und in der start.php zeilenweise mit fgets ausgelesen.
Einziges Problem: Wenn im Text ein Zeilenumbruch ist, gibts Ärger, da die zweite Zeile dann schon als nächster Name interpretiert wird.
Das wollte ich eigentlich durch   "fwrite($dh,nl2br($text)."\n");" umgehen, so dass jeder Zeilenumbruch im Text durch ein <br> ersetzt wird, hat aber irgendwie nciht funktioniert und da hab ichs wieder rausgenommen.
Vielleicht findest Du dafür ja noch eine Lösung.

Gruß Spawn

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Und genau deswegen ist es sinnvoll, für jeden "Datensatz" eine eigene Zeile zu verwenden und die einzelnen Attribute (Name, Mail etc.) per Trennzeichen zu notieren.

Kurz noch bemerkt: das bisher verwendete Komma ist als Separator natürlich totaler ** Netiquette! **, denn in fast jedem Text kommt irgendwie mal ein Komma vor. Besser wäre sowas wie "|" oder auch eine Zeichenfolge, deren Auftretenswahrscheinlichkeit innerhalb eines Textes sehr gering ist.

greez 8)
JoSsiF

Wie kann ich das Trennungszeichen verändern bzw. das Problem mit dem Zeilenumbruch umgehen???
Hat da zufällig jdm. eine Lösung parat?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

MySQL. Ist das bei Dir möglich? Das hat einige Vorteile. Besonders wenn Du weiterdenkst und dann vielleicht auch mal einen Eintrag bearbeiten oder sogar löschen willst.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Wie kann ich das Trennungszeichen verändern
Na das solltest du aber schon wissen, schließlich hast du ja das bisherige Trennzeichen auch selber gesetzt ;D
Schau mal in dein 1. Posting in diesem Thread. Dort steht folgende Zeile:
fwrite($dh,"$namen,$mail,$text\n");Was wird da das Trennzeichen sein?
Wenn du dort etwas änderst, musst du noch den 1. Parameter im explode-Befehl anpassen, denn der bestimmt das Trennzeichen, anhand dessen der String zerhackt wird.

Ansonsten geb ich Spawn Recht: MySQL ist schon zu empfehlen, wenn's dann auch im solche Sachen wie Löschen geht. Ansonsten wird's mit der Textdatei etwas unkomfortabel.
Übrigens: Wenn dein Webhoster PHP anbietet, wird sicher auch MySQL dabei sein, denn die beiden Sachen treten häufig als "Gespann" auf.

greez 8)
JoSsiF

Also mysql ist nicht vorhanden ist auch nicht so schlimm da ich das ja eh nur hobbymäßig mache bzw. es (noch) nich ins internet stellen werde!

Zu den Trennungszeichen ich habe die Kommas als normales zeichen gesehen ich hab nich gewusst dass die das trennungszeichen sind (bzw. dass ich das verändern kann)

Danke an alle

-------------

edit1:

lustig! Wenn ich mir die textedatei (gbdok) ansehe dann ist sie auf chinesisch oder so geschrieben!


edit2:

was hat es in der einen datei mit dem Punkt auf sich???

fwrite($dh,$namen."\n");

also der punkt nach $namen

sorry wegen den dummen fragen aber ich bin html anfänger und wage mich gerade auf neues terrain!

« Letzte Änderung: 01.05.05, 23:04:49 von Syrus »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Der Punkt fungiert in php als Verkettungszeichen.
fwrite($dh,$namen."\n"); bedeutet also: schreibe den Inhalt von $namen gefolgt von "\n" (also dem Zeilenumbruch) in die Datei.

Gruß Spawn

PS: Wenn Du php mehr so zum Spaß machst lies Dir am besten mal ein paar Tutorials durch. Da werden viele grundlegende Sachen erstmal erklärt und es ist trotzdem nicht langweilig, da es in php sooo viele Grundlagen nicht gibt (zumindest wenn man schon eine Programmiersprache einigermaßen beherrscht).
Obwohl, selber lernen ist eignetlich auch cool. Naja, Du machst das schon  ;)

Ja Tutorials wollt ich mir auch mal anschaun nur wollt ich mich vorher noch schnell durch eine kleine Aufgabe durchbeißen!
Danke erstmal für die vielen hilfreichen Beiträge!!!!

Dann noch eine abschließende Frage:

Wie kann man das mit den Zeilenumbrüchen lösen???

« Letzte Änderung: 02.05.05, 17:28:07 von Syrus »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nunja, wie gesagt: Eigentlich wollte ich das ganze durch nl2br() umgehen. nl2br oder auch NewLineToBreak sollte eigentlich jeden Zeilenumbruch durch ein <br> ersetzen, was das Problem lösen sollte. Allerdings hat das bei mir nicht funktioniert. Vielleicht habe ich aber auch irgendeinen blöden Fehler gemacht. Der Befehl funktioniert so:

$ohnenl = nl2br($mitnl);oder auch:
echo(nl2br($mitnl));etc....
Das Problem bei meinem Beispiel war eben, dass ich die Datei mit fgets() ausgelesen habe und das bis zum nächten Zeilenumbruch ausliest.
Du kannst allerdings auch Zeichen für Zeichen auslesen und bei einem Trennzeichen Deiner Wahl (zB |) Schluss machen.

Das geht dann in etwa so:
$s="";
$art = 0;
//$art steht für: 0:name 1:email 2:text
$handle = fopen ("gbdok.txt", "r");
do
{
  $zeichen = fgetc( $handle ); //holt sich das nächste Zeichen
  if($zeichen)
  {
    if($zeichen = "|")
    {
      switch($art)
      {
        case 0: $namen = $s; break;
        case 1: $email = $s; break;
        default: $text = $s; break;
      }
      $s = "";
      $art = &art + 1;
      if( $art == 3)
      {
        $art = 0;
        //Ausgabe der Daten
      }
    }
    else $s = $s + $zeichen;
  }
}while($zeichen);

Puuh, das war mal schnell aus den Fingern gesaugt, ungetestet, ich hoffe es funktioniert. Vielleicht mal noch ne Erklärung:
$art gibt an, was gerade ausgelesen wird, 0 für name, 1 für mail, 2 für text. $s ist die momentan ausgelesene Zeichenkette.
Man beginnt also bei $art=0 und $s="" und liest das erste Zeichen. Dann das 2te usw. Wenn dann "|" kommt wird geschaut: $art = 0, also wird $name = $s und $art eins hochgesetzt.
Wenn $art dann drei ist, ist alles für einen Eintrag ausgelesen. Es wird ausgegeben (name, email, text) und $art wieder auf 0 gesetzt.
Und das solange bin $zeichen = false ist, also die Datei zuende.

Wahrscheinlich gibt es auch einen viiiieeeeel eleganteren Weg und bestimmt auch irgendwo n kleinen Fehler im Programm... :( ....versuch einfach mal und meld Dich, wenn Du's nicht packst.

Gruß Spawn
« Letzte Änderung: 03.05.05, 01:24:39 von Spawn »

Also irgendiwe wird mir php ewig ein rätsel bleiben:


<html><head><title></title></head><body>

<?php
echo"<html><head><title></title></head><body>";

echo"<table border='1' width='72%' id='table1'>";
   echo"<tr>";
      echo"<td width='18%'>";
      echo"<p align='left'>#</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>1</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>Name</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>Syrus</td>";
   echo"</tr>";
   echo"<tr>";
      echo"<td width='18%'>";
      echo"<p align='left'>Betreff</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>Gruß</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>email</td>";
      echo"<td wideth='18%'";
      echo"<p align='left'>Syrus@...</td>";
   echo"</tr>";
   echo"<tr>";
      echo"<td width='18%'>";
      echo"<p align='left'>Datum</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>10.02.2005</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>Zeit</td>";
      echo"<td width='18%'>";
      echo"<p align='left'>15.50</td>";
   echo"</tr>";
echo"</table>";


$auslesen=fopen("gbdok.txt","r");
foreach($auslesen as $value){
   $paar=split("!&!",$value);
   echo"<tr><td>$paar[0]</td><td>$paar[1]</td><td>$paar[2]</td><td>$paar[3]</td><td>$paar[4]</td><td>$paar[5]</td>

}




echo"<table border='1' width='72%' id='table2' height='26'>";
   echo"<tr>";
      echo"<td>";
      echo"<p align='left'>text</td>";
   echo"</tr>";
echo"</table>";

echo"</body></html>";
?>


ich will jetzt die daten auslesen, so dass er die in die freien felder der tabelle einfügt! Also praktisch als datum usw.! Es geht nur erst ma drum, dass er ne datei ausliest und diese dann aufteilt und richtig einfügt!!! (ich habe die felder schon ausgefüllt sprich bei name steht schon was muss dan halt natürlich weg!)

« Letzte Änderung: 04.05.05, 16:54:54 von Syrus »

« HOMEPAGE VORLAGENAccount »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

Beta Version
Unter einer Beta Version versteht man ein Programm, das sich in einer Testphase, also noch vor der finalen Version, die veröffentlicht wird, befindet. Allgemein wird...