file_exits() zuerst false abarbeiten

Ruigy

Grünschnabel
Hallo Leute,

sorry ist wahrscheinlich eine total bescheuerte Frage, aber ich habe gerade mit PHP angefangen und komm über eine eigentlich ganz einfache Sache rüber.

Ich will mir eine kleine Log-Datei anlegen, die fortlaufend den Zugriffszähler und die Uhrzeit logt. Diese soll bei nicht existens neu angelegt werden (if (file_exists($fp))=false dann erstmal eine neue Log-Datei anlegen) danach soll jeweils eine neue Zeile eingefügt werden mit der aktuellen Uhrzeit. Aber irgendwie bin ich zu doof dazu. Ich finde immer nur zu file_exists() das true zuerst abgearbeitet wird und erst anschließend mit else der false Zustand.
Ich finde es viel logischer erst zu schauen ob etwas da ist, falls nicht dann anlegen und erst danach weiterzumachen. Habe ich da irgendwie einen Denkfehler?

Besten Dank im voraus
Ruigy
 
hi !

Versuch es mal mit folgendem Code !

PHP:
if (!file_exists($fp)) {
  //File existiert nicht
}  else {
 //File existiert
}

Der Code überprüft zuerst ob $fp FALSE ist und erst beim ELSE führt es den Code aus, wenn die Datei schon besteht(also bei dir das loggen).
 
Hallo Kranetierli,

ups das ging aber schnell. :)
Super das wars, besten Dank nochmals
Ist ein vorangestelltes Ausrufezeichen immer als Invers-Abfrage zu verstehen?
Gruß
Ruigy
 
Ist ein vorangestelltes Ausrufezeichen immer als Invers-Abfrage zu verstehen?

Genau! Also die Frage in Textform ist:

"Existiert die Datei nicht?"

Damit die IF-Schlaufe zuschnappt, braucht diese aber einen TRUE Wert, den sie auch bekommt, da die Frage von !file_exists() ja mit TRUE beantwortet wird.

Das Ausrufezeichen kann man bei vielen Funktionen benützen, ein viel gebrauchtest Beispiel wäre auch:
PHP:
if ($eingabe!="1") { 
  echo "Die Eingabe ist nicht 1.";
}  else { 
 echo "Die Eingabe ist 1.";
}

Ich hoffe ich konnte dir das ein bisschen Veranschaulichen :)

Viel Spass weiterhin mit PHP *g*
 
So da bin ich nochmal. Es klappt soweit ganz gut, wenn die Datei vorhanden ist bzw. das Script schon mal gelaufen ist und die Datei anlegt. Ich hoffe nerve nicht, aber aller Anfang ist schwer und selbst so ein pisseliges Script macht nicht das was ich will. :(

Beim ersten Lauf meldet es mir folgende Fehler:

Warning: rewind(): 2 is not a valid stream resource in ../sl_log1.php on line 19

Warning: fgets(): 2 is not a valid stream resource in ../sl_log1.php on line 20

Warning: fputs(): 2 is not a valid stream resource in ../sl_log1.php on line 22

Warning: rewind(): 2 is not a valid stream resource in ../sl_log1.php on line 28

Warning: fputs(): 2 is not a valid stream resource in ../sl_log1.php on line 29

Warning: fclose(): 2 is not a valid stream resource in ../sl_log1.php on line 31
Der Zugriffszähler steht auf 1

Es erstellt korrekt die Datei und beim nächsten Lauf sind die Fehlermeldungen weg.
Hier mein bisheriger Code:

PHP:
<?
	$fn = "sl_log1_data.txt";
	if (!file_exists($fn))
	{
	/* erster Zugriff */
	$zahl = 0;
	
	/* neue Zahl schreiben */
	$fp = fopen($fn,"w");
	//flock($fp,2);
	fputs($fp,$zahl);
	//flock($fp,3);
	fclose($fp);	  
	}
	else
	$fp = fopen($fn,"r+");
	rewind($fp);
	$zahl = fgets($fp,12);
	$nl = chr(13) . chr(10); //newline
	fputs($fp,$nl);
	
	/* Zahl erhöhen */
	$zahl = $zahl + 1;
	
	//flock($fp,2);
	rewind($fp);
	fputs($fp,$zahl);
	//flock($fp,3);
	fclose($fp);
	echo "Der Zugriffszähler steht auf $zahl";

?>

Aber auch danach funktioniert es nicht wie ich es mir vorstelle. Es sollte eigentlich sowas ausgeben wie:
4
3
2
1

aber es steht nur die aktuelle Zahl drin also 4.
Verstehe ich nicht.
 
Zuletzt bearbeitet:
Ich kenne mich leider nicht so gut aus mit Dateien mit PHP erstellen, aber wenn ich über deinen Code schaue fällt mir auf, dass du keine {}-Klammern beim ELSE-Zweig gesetzt hast!
PHP:
else {
    $fp = fopen($fn,"r+"); 
    rewind($fp); 
    $zahl = fgets($fp,12); 
    $nl = chr(13) . chr(10); //newline 
    fputs($fp,$nl); 
     
    /* Zahl erhöhen */ 
    $zahl = $zahl + 1; 
     
    //flock($fp,2); 
    rewind($fp); 
    fputs($fp,$zahl); 
    //flock($fp,3); 
    fclose($fp); 
    echo "Der Zugriffszähler steht auf $zahl";
}
 
Das öffnen einer Datei zum schreiben mit "w" löscht den Inhalt bzw erstellt die datei neu. Das öffnen mit "w+" allerdings macht dasselbe, jedoch werden die Inhalte am Ende der Datei angehängt, es sei denn, Du änderst das Verhalten mit fseek :)
 
Stimmt, wenn ich die setze verschwinden die Fehlermeldungen beim ersten Zugriff und die Datei wird erstellt. Allerdings wird dann nicht das eigentliche mehr abgearbeitet, sprich:

schau in der neu erstellten Datei nach der ersten Zahl, speicher diese in eine Variable, setze Variablenwert + 1, füge eine Leerzeile ein, füge aktuellen Variablenwert in die 1. Zeile, speichern der Datei.

Ich kann natürlich locker vorab eine Datei anlegen, aber wenn´s schon bei sowas einfachem nicht klappt, bekomm ich später mit Sicherheit nur Schwierigkeiten mit PHP.
 
Stimmt, wenn ich die setze verschwinden die Fehlermeldungen beim ersten Zugriff und die Datei wird erstellt. Allerdings wird dann nicht das eigentliche mehr abgearbeitet, sprich:

schau in der neu erstellten Datei nach der ersten Zahl, speicher diese in eine Variable, setze Variablenwert + 1, füge eine Leerzeile ein, füge aktuellen Variablenwert in die 1. Zeile, speichern der Datei.

Ich kann natürlich locker vorab eine Datei anlegen, aber wenn´s schon bei sowas einfachem nicht klappt, bekomm ich später mit Sicherheit nur Schwierigkeiten mit PHP.

Ah ja stimmt sry, der zweite Teil muss ja so oder so abgearbeitet werden, du willst nur sichergehen, dass eine Datei vorhanden ist, die gegebenfalls vorher schreiben.

Dann nimm die Klammern und das ELSE weg, damit da nicht Codeleichen rumliegen *g*

Mit meinem Wissen über Dateien bin ich am Ende und somit mach ich auch grad Mittagspause... Guten hunger :)
 
Oh sorry, da war Andy72 schneller als ich mit meiner Antwort auf Kranetierli´s posting.

zu Andy72:
ich benutze ja nur beim ersten mal die "w" option. Die Datei ist ja dann noch nicht existent und in sofern sollte es ja soweit funktionieren.
Anschließend öffne ich ja mit "r+" was dann wohl die existierende Datei im "lese/schreib"-Modus öffnet.
 
Zurück