• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

flock, fputs ?

wapplegraph

Normande
Registriert
12.04.06
Beiträge
571
Hallo

Ich habe eine Frage bei PHP: wenn man etwas z.B in einer .txt Datei ändern möchte, so löst man dies mit flock, fopen und fputs oder gibts hier andere bessere Lösungen?

Besten Dank Jonas
 
Zuletzt bearbeitet:

Corny

Hildesheimer Goldrenette
Registriert
15.06.06
Beiträge
680
Flock? o_O hab ich was verpasst?
Ich benutz dazu TextEdit ("In reinen Text umwandeln", wenn du ne neue .txtdatei erstellst) oder Smultron (einfach .txt anfügen, wenn du ne neue machst)...
 

Corny

Hildesheimer Goldrenette
Registriert
15.06.06
Beiträge
680
Sag das doch...
Keine Ahnung :D
 

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
guck doch mal bei php.net - da müsstest du unter fputs auch noch ähnliche funktionen finden, wenn es die gibt...
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Hallo

Ich habe eine Frage bei PHP: wenn man etwas z.B in einer .txt Datei ändern möchte, so löst man dies mit flock, fopen und fputs oder gibts hier andere bessere Lösungen?

Besten Dank Jonas

Das kommt ganz darauf an, was mit der Datei passieren soll. Der übliche Weg wäre, zunächst zu prüfen, ob Du die Datei lesen darfst: is_readable($file). Dann kannst Du die Datei entweder mit file() oder mit file_get_contents einlesen. fopen und fputs können auch praktischer sein, das hängt jedoch von Deinen Wünschen ab. Wie mein Vorredner schon schrieb, solltest Du hier einfach mal in die Doku schauen ;)
 

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
stimmt, mit "file_get_contents" kannst du auch mit einem einzigen befehl eine komplette datei einlesen, aber denk dran:

1. existiert die datei (file_exists)??
2. darfst du sie lesen (is_readable)??

und dann erst einlesen...;)


-me
 

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Wenn die Datei "readable" ist, existiert sie auch. Die erste Funktion kann man sich also sparen. Funktioniert zumindest bei mir ganz gut.
 

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
Wenn die Datei "readable" ist, existiert sie auch. Die erste Funktion kann man sich also sparen. Funktioniert zumindest bei mir ganz gut.

:p und wenn man die datei lesen kann, dann existiert sie wohl und ist auch lesbar - nur ohne die vielen schritte ist eine spätere fehleranalyse schwieriger, was in diesem fall ja eher kein problem darstellen sollte...
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
:p und wenn man die datei lesen kann, dann existiert sie wohl und ist auch lesbar - nur ohne die vielen schritte ist eine spätere fehleranalyse schwieriger, was in diesem fall ja eher kein problem darstellen sollte...

Kommt eben darauf an, ob man Exceptions »manuell« abfangen (also ohne, dass PHP Exceptions kennt) möchte, und wie hoch man die eigenen Ansprüche schraubt. Für den Schnell&Dreckig-Ansatz mag das genügen, für den OOP-Ansatz wäre das natürlich unschön. Man kann's ja so lösen:

Code:
<?php

    $filename = '/pfad/zum/text.txt';
    $errors = array();
    if (file_exists($filename)) {
        if (is_readable($filename)) {
            if ($file_contents = file_get_contents($filename)) {
                 // Aufruf von fummel_an_datei_rum();
            } else {
                 $errors['file_get_contents'] = 'Die Datei konnte nicht eingelesen werden. Abbruch.';
            }
        } else {
            $errors['is_readable'] = 'Die Datei durfte nicht eingelesen werden. Abbruch.';
        }
    } else {
        $errors['file_exists'] = 'Die Datei existierte nicht. Abbruch.';
    }
?>

Solche Fehlersammler sind hilfreiche Konstrukte, wenn man sich noch nicht so sicher ist, oder eine ausführliche Debug-Ausgabe plant. Später weiß man dann mit echo"<pre>\n", print_r($errors), "</pre>\n"; genau, was los ist, wenn kein fataler Fehler aufgetreten ist.
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Bist Du Sicher, Dein Ansatz ist sicher? Siehe Kommentar im Code.
Code:
<?php

    $filename = '/pfad/zum/text.txt';
    $errors = array();
    if (file_exists($filename)) {
         if (is_readable($filename)) {
            if ($file_contents = file_get_contents($filename)) {
            # Hier könnte das Multitasking zuschlagen und ein anderer Prozess
            # kann Dir die Datai löschen.
            # Dumm gelaufen, denn nun sollte es eine Exception geben.
                // Aufruf von fummel_an_datei_rum();
            } else {
Also ein file locking sollte man schon als allererstes versuchen, damit einem niemand die Datei entzieht.
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Bist Du Sicher, Dein Ansatz ist sicher? Siehe Kommentar im Code.

Also ein file locking sollte man schon als allererstes versuchen, damit einem niemand die Datei entzieht.

Ja, auf jeden Fall. Mit ein Grund, warum ich Dateioperationen zugunsten von Datenbanklösungen vermeide. flock() funktioniert nämlich leider nicht immer zuverlässig, »LOCK TABLE« schon (also sei MySQL 4.1).
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Würg, warum benutzt Du keine richtige Datenbank und schickst ihr Transaktionen?

»Würg«, das tue ich, wenn ich das brauche, aber ich habe den Eindruck, wir schweifen ab. Im Übrigen denke ich, dass skeeves Beitrag hilfreich ist, ein »Würg«-Einwurf jedoch nicht.
 

wapplegraph

Normande
Registriert
12.04.06
Beiträge
571
Hallo

Danke für eure Antworten, werde dies alles einmal testen und anschauen.

Merci wapplegraph
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.060
»Würg«, das tue ich, wenn ich das brauche, aber ich habe den Eindruck, wir schweifen ab. Im Übrigen denke ich, dass skeeves Beitrag hilfreich ist, ein »Würg«-Einwurf jedoch nicht.
Es geht darum den grundlegenden Entwurf zu überdenken. Es gibt wenige bis gar keine Gründe auf Dateien zuzugreifen, aber das trifft auf TABLE LOCKS genauso zu. TABLE Locks benutzt man nur dann, wenn man keine echtes RDBMS hat und sich mit dieser Krücke behelfen muß. Selbst MySQL kennt einen halbwegs brauchbaren Tabellentypen (InnoDB).