text datei

nordi

Erfahrenes Mitglied
Hi Leute,

nachdem ich mir die Basics von Php auf schattenbaum.net durchgelesen habe, kam die Idee ein kleines einfaches txt Gästebuch zu schreiben.
Es hat auch wirkliches alles wunderbar funktioniert - nur eins nicht.
Also, mit dem Formular schreibe ich die Daten in die datei "data.txt" mit dem Befehl :

PHP:
<?php
$daten="Name: $name<br>
 E-Mail:<a href=mailto:$email>$email</a><br>$eintrag<br>
 Homepage:<a href=mailto:$homepage>$homepage</A><br><br>";
$datenbank = "data.txt";
$datei = fopen($datenbank,"a");
fwrite($datei, $daten);
?>

Wenn die index.php die Daten jetzt ausliest, sind die neuen Einträge immer unter den alten - normaler Weise müssten die neuen Einträge über den alten sein....Ich hab da was von einem "rewind" Befehl gehört.

Danke schonmal im vorraus...

Marius

=)
 
Hallo nordi,

leider lässt sich dieses Problem nicht durch den rewind()-Befehl lösen. Dieser setzt zwar den Dateizeiger an den Anfang der Datei, jedoch führt ein Aufruf von fwrite() immer noch dazu, dass der String am Ende angehängt wird, wenn die Datei mit dem Mode "a" geöffnet wurde.

Man könnte das Problem jedoch ganz einfach lösen:

1. Datei in String einlesen
2. Datei leeren
3. Neuen Eintrag in Datei schreiben
4. Alte Einträge in Datei schreiben

Ist zwar bei sehr großén Dateien dann nicht mehr recht effektiv, aber für den Anfang reicht's.

Hier mal ein Beispielcode (wie immer untested =)):
PHP:
<?php
$datenbank = "data.txt";

$alte_eintraege = join('', file($datenbank));

$datei = fopen($datenbank, "w");
$neuer_eintrag = "Name: $name<br>
E-Mail:<a href=\"mailto:$email\">$email</a><br>
$eintrag<br>
Homepage:<a href=\"$homepage\">$homepage</a><br><br>\n";

fwrite($datei, $neuer_eintrag);
fwrite($datei, $alte_eintraege);

fclose($datei);
?>

HTH


PS.: "mailto:$homepage"? War wohl ein Flüchtigkeitsfehler ;)
 
Hallo, ich hatte dies zwar schon mal hier
irgend wo eingestellt, aber find es auf
die schnelle nicht im Forum, daher noch
mal.

Unter $nr bezeichnest Du die Zeile, die
geschrieben werden soll. Zählen wie der
Computer, also mit null beginnend.
$arrDatei bezeichnet die Originaldatei
$arrDateiSav ist die Sicherungskopie#
wird nach jedem Runn aktuallisiert.
$arrDateiNeu ist die Temp. schreibdatei

Es funkt so: Die Datei wird Zeilenweise
ausgelesen und umgeschrieben. An der Stelle,
wo die Zeile sich ändert, bei $nr, wird die
neue Zeile, Inhaltsvariable $neu eingefügt.

Du musst jetzt nur noch das Trennzeichen #
durch Dein Trennzeichen zwischen den einzelnen
Zeileninhalten ersetzen.

Am Anfang und am Ende ist jeweils eine Kontrollausgabe
der Datei eingebaut, damit man gleich sieht, ob es funkt.

Frage noch, wie bekommt ihr euern Code so schon farbig hin



// bezeichnet die zu ändernde Zeile
// wenn hier > Gesamtzeilen,
// dann wird keine neue Veränderung vorgenommen
$nr = 3;
// Originaldatei
$arrDatei="daten.txt";
// Save der Originaldatei vor Überschreiben
$arrDateiSav="datenSav.txt";
// Datei zur Zwischenlagerung
$arrDateiNeu="datenNeu.txt";

// Eingeben der zu ändernden Daten
//Kann man durch Textfelder ändern
$neu1 = "Seas";
$neu2 = "Leute";
$neu3 = "100";

$neu = "$neu1#$neu2#$neu3#\n";


// überprüfen ob Datei existiert
if (file_exists($arrDatei))
{
// Auslesen der Daten aus externer Datei: eindim. Array
$auslesen=file($arrDatei);
// Umwandeln der Daten in mehrdim. Array
for ($i=0;$i<sizeof($auslesen);$i++)
{
$artNummer[$i]= explode("#",$auslesen[$i]);
} // Ende for Schleife
} // Ende if Schleife




// kontrollAusgabe des Array aus Originaldatei
for ($i=0;$i<sizeof($artNummer);$i++)
{
echo "Array Nr: [".$i."]==> Array: ";
while (list ($index,$inhalt)= each ($artNummer[$i]))
{
echo "[".$index."]=>".$inhalt." ";
}
echo "<br>";
} // Ende for

// Öffnen der Betreffenden Dateien
// zum Auslesen der benötigten Daten
$fp=fopen($arrDatei,"r");
// zum Schreiben der geänderten Daten
$fp2=fopen($arrDateiNeu,"w+");
$nl = chr(13) . chr(10);


// durchsuchen der Datei, bis Ende erreicht
while (! feof($fp) )
{
// Zeilenweises auslesen der Zeilen
$zeile = fgets($fp,4096);
// $nr Zeile erreicht Inhalt wird mit
// $neu geändert
if ($z==$nr)
{
fputs($fp2,$neu);
echo "<p>Das Array Nr: <b>".$nr."</b> wird ersetzt durch: <b>".$neu."</b><p>";
} // Ende if
// Andere Zeilen werden unverändert zurückgeschrieben
else
{
fputs($fp2,$zeile);
} // ende else
// ZeilenZähler wird inkrementiert
$z++;
} // Ende while
// Originaldatei schliessen
fclose($fp);
// Neue Datei schliessen
fclose($fp2);
// Sav Datei wird gelöscht
unlink ($arrDateiSav);
// Originaldatei wird umbenannt
rename ($arrDatei,$arrDateiSav);
// Neue Datei erhält Namen von Originaldatei
copy ($arrDateiNeu,$arrDatei);



// Kontroll-Ausgabe der geänderten Daten aus datenNeu.txt
// überprüfen ob Datei existiert
if (file_exists($arrDateiNeu))
{
// Auslesen der Daten aus externer Datei: eindim. Array
$auslesenNeu=file($arrDateiNeu);
// Umwandeln der Daten in mehrdim. Array
for ($i=0;$i<sizeof($auslesenNeu);$i++)
{
$artNummerNeu[$i]= explode("#",$auslesenNeu[$i]);
} // Ende for Schleife
} // Ende if Schleife


// Ausgabe des Array aus Neu
for ($i=0;$i<sizeof($artNummerNeu);$i++)
{
echo "Array Nr: [".$i."]==> Array: ";
while (list ($index,$inhalt)= each ($artNummerNeu[$i]))
{
echo "[".$index."]=>".$inhalt." ";
}
echo "<br>";
}
_____________________________________________________________________

ende Schnipsel



:( :(
 
@reima: danke! ich werds sofort ausprobieren. Das mit <a href=mailto:$homepage> war natürlich ein schreibfehler :-)

@petermedien: bin ein totaler anfänger mit php und blick durch deinen code überhaupt nicht durch. was soll das sein und wofür kann ich das gebrauchen?

greets aus köln

marius :-)
 
mh - das sieht mir viel zu kompliziert aus!
hab aber noch ne andere frage. Wie kann ich das machen, dass das Script pro Seite nur 10 Einträge ausgibt?
 
dazu gibts doch auch ein tut in der prog section

prinzipell bestimmst du halt eine maximale anzahl der einträge pro seite und übergibst dann per url einen parameter(die seitenzahl) und liest dann aus der text datei die entsprechenden zeilen aus

zb.
wenn seite=1
zeige einträge 1-10
wenn seite=2
zeige einträge 11-20
 
Mh..hab mal in den Tut's geguckt, hab aber nichts gefunden....da muss ich mal wieder meinen eigenen Geist anstrengen :p

Ich hab noch ne Frage zum "if-Befehl"

Ich wollte einen if-befehl bei der emailfunktion im script ausprobieren, leidet wirft er aber immer eine fehlermeldung aus:

PHP:
<?php
$datenbank = "data.txt";

$alte_eintraege = join('', file($datenbank));

$datei = fopen($datenbank, "w");
$neuer_eintrag = "Name: $name<br>
E-Mail:
if($email == "") { echo "keine Email"; } else {
"<a href=\"mailto:$email\">$email</a>"; }<br>
$eintrag<br>
Homepage:<a href=\"$homepage\">$homepage</a><br><br>\n";

fwrite($datei, $neuer_eintrag);
fwrite($datei, $alte_eintraege);

fclose($datei);
?>

Leider funktioniert das nicht...

:-) :-)
 
Zuletzt bearbeitet:
Hallo,

ich weiss zwar nicht, wie Du die
Variablen übergibst, aber
mit diesen vorangestellten Variablen

$name = "Peter";
$email = "petermedien@gmx.net";
$eintrag = "blablabal";
$homepage = "www.diesunddas.de";

funktioniert die Ausgabe
mit echo $neuer_eintrag wie folgt:

Name: Peter
E-Mail: petermedien@gmx.net
blablabal.
Homepage: http://www.diesunddas.de
PHP:
$neuer_eintrag = "Name: $name<br>
                  E-Mail:";
             if($email == '') 
                  { 
                        $neuer_eintrag = "$neuer_eintrag keine Email"; 
                  } else {
                        $neuer_eintrag = "$neuer_eintrag <a href=\"mailto:$email\">$email</a><br>"; 
                      }
             
       $neuer_eintrag = "$neuer_eintrag $eintrag.<br>
             			Homepage: <a href=\"$homepage\">$homepage</a><br><br>\n<br>";


Wenn ich das richtig verstanden habe, willst Du in die
Variable $neuer_eintrag alle vorgenommenen Einträge
zusammenfassen. Durch die eingeschobene if-else bin ich
hier schrittweise vorgegangen.

Jetzt müsste eventuell die übertragenen Variablen noch an
den Übergabemodus, falls notwendig angepasst werden.

Hope, ich konnte helfen.

Gruss
Peter
 
Oder für Freunde der Kurzschreibweisen:
PHP:
$neuer_eintrag = "Name: $name<br>
E-Mail: ".(($email=="")?"keine Email":"<a href=\"mailto:$email\">$email</a>")."<br>
$eintrag<br>
Homepage:<a href=\"$homepage\">$homepage</a><br><br>\n";


@petermedien:
Das hier ist unschöner Programmierstil bzw. unüblich:
PHP:
$neuer_eintrag = "$neuer_eintrag keine Email";
Man würde eher diese Schreibweise benutzen:
PHP:
$neuer_eintrag .= " keine Email";
Nur mal so am Rande...
 
Zurück