SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Handbuch der Java-Programmierung

Handbuch der Java-Programmierung zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 26.02.2006, 22:19:23
Heppi Heppi ist offline
Anfänger
 
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
fopen() ohne Überschreiben

Hallo zusammen,

hab da mal ein Problem(?) mit fopen().
Wenn ich eine Datei mit fopen() mit dem Parameter a+ öffne, heißt das ja, daß der Zeiger auf den Beginn der Datei gesetzt wird und ab da geschrieben wird. Allerdings wird der bisherige Dateiinhalt überschrieben, nicht der neue Text eingefügt. Gibt's da einen Parameter, den ich nicht kenne, damit das funktioniert oder muß ich immer den Inhalt der Datei sichern und wieder an das Neue hinten anhängen?
Danke für eure Hilfe!

Grüße, Heppi.
Mit Zitat antworten
  #2  
Alt 26.02.2006, 22:26:38
feuervogel feuervogel ist offline
SELFPHP Guru
 
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
AW: fopen() ohne Überschreiben

Zitat:
Zitat von Heppi
Wenn ich eine Datei mit fopen() mit dem Parameter a+ öffne, heißt das ja, daß der Zeiger auf den Beginn der Datei gesetzt wird und ab da geschrieben wird.
woher hast du das? im handbuch finde ich folgendes:

Zitat:
'a+': Öffnet die Datei zum Lesen und Schreiben. Positioniert den Dateizeiger auf das Ende der Datei. Wenn die Datei nicht existiert, wird versucht sie anzulegen.
quelle

ach, und so lange du uns deinen quellcode vorenthälst, können wir deinen fehler auch nicht finden.
Mit Zitat antworten
  #3  
Alt 26.02.2006, 22:48:32
Heppi Heppi ist offline
Anfänger
 
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
AW: fopen() ohne Überschreiben

Oh, sorry. Das war mein Fehler. Natürlich meinte ich r+.

PHP-Code:
$log_datei fopen('log.txt''r+');
flock($log_dateiLOCK_EX);
fputs($log_datei$log_inhalt);
flock($log_dateiLOCK_UN);
fclose($log_datei); 
Rufe ich diesen Quellcode mit $log_inhalt = '11111' auf und danach nochmal mit $log_inhalt = '222', steht in log.txt folgendes: '22211'. Ich hätte aber gerne '22211111'.
Gibt's da 'ne Möglichkeit ohne erst die Datei komplett auszulesen, das Ganze dann zusammenzuhängen und wieder abzuspeichern?

Grüße, Heppi.
Mit Zitat antworten
  #4  
Alt 27.02.2006, 00:22:07
Giz Giz ist offline
Junior Member
 
Registriert seit: Apr 2005
Beiträge: 309
AW: fopen() ohne Überschreiben

Wäre das komplizierter, als das, was Du da tust?
Auf das bißchen Daten einlesen kommt es doch auch nicht an!
Stehen die Daten tatsächlich in einer Zeile?
Mit Zitat antworten
  #5  
Alt 27.02.2006, 08:56:43
Heppi Heppi ist offline
Anfänger
 
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
AW: fopen() ohne Überschreiben

Zitat:
Zitat von Giz
Wäre das komplizierter, als das, was Du da tust?
Nee, eigentlich nicht. Aber ich habe nach einem Ausweg gesucht, weil das Skript in unregelmäßigen Abständen Probleme bereitet, für die ich keine Erklärung habe.

Ich habe mir so ein log-Skript gebastelt, welches die Besucher meiner Seiten mitloggt. Das sieht im wesentlichen folgendermaßen aus:

PHP-Code:
//Datei öffnen, auslesen und in $log_inhalt abspeichern

... // abzuspeichernde Daten ermitteln

$log_inhalt "$datum|||$zeit|||$ip|||$last_site|||$browser|||$browser_version|||$bs|||||$log_inhalt";

if(
substr($log_inhalt, -5) == '|||||')
    
$log_inhalt substr($log_inhalt, -strlen($log_inhalt), -5);

$chmod_flag 0;
if(
file_exists($log_file))
    
$chmod_flag 1;

$log_datei fopen($log_file'w');
flock($log_dateiLOCK_EX);
fputs($log_datei$log_inhalt);
flock($log_dateiLOCK_UN);
fclose($log_datei);

if(
$chmod_flag == 0)
    
chmod($log_file0777);

$general_inhalt "$general_zaehler_stand|||$datum|||$general_tageszeit_gesamt|||$general_wochentage_gesamt|||$general_monate_gesamt|||$general_browser_gesamt|||$general_bs_gesamt";

$general_datei fopen($general_file'w');
flock($general_dateiLOCK_EX);
fputs($general_datei$general_inhalt);
flock($general_dateiLOCK_UN);
fclose($general_datei); 
Ich habe eine Datei (steht in $log_file), welche automatisch jeden Monat neu angelegt wird (soll übergroße Dateien vermeiden). In dieser werden verschiedene Informationen abgelegt. Das Skript wird jedesmal aufgerufen, wenn jemand auf die entsprechende Seite klickt.
Zusätzlich werden generelle Informationen in $general_file abgelegt.

Ab und zu kommt es bei mir jetzt vor, daß plötzlich der ganze Inhalt der Datei weg ist und nur noch der neueste Eintrag drin steht. Was kann das sein? Sind das Probleme beim Auslesen der Datei?

Zitat:
Zitat von Giz
Stehen die Daten tatsächlich in einer Zeile?
Ja.

Grüße, Heppi.
Mit Zitat antworten
  #6  
Alt 27.02.2006, 12:27:07
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: fopen() ohne Überschreiben

Zitat:
Zitat von Heppi
Ab und zu kommt es bei mir jetzt vor, daß plötzlich der ganze Inhalt der Datei weg ist und nur noch der neueste Eintrag drin steht.
Scriptfehler: zeitgleiche Zugriffe auf das selbe Script.

Das ist der Tod jedes Billiggästebuchs und jedes Newbie-Counters, die die Vorteile eines DBMS einfach nicht begreifen wollen.
Mit Zitat antworten
  #7  
Alt 27.02.2006, 12:29:04
Heppi Heppi ist offline
Anfänger
 
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
AW: fopen() ohne Überschreiben

Zitat:
Zitat von meikel
Scriptfehler: zeitgleiche Zugriffe auf das selbe Script.

Das ist der Tod jedes Billiggästebuchs und jedes Newbie-Counters, die die Vorteile eines DBMS einfach nicht begreifen wollen.
Durch die Geschichte hier
PHP-Code:
flock($general_dateiLOCK_EX);
flock($general_dateiLOCK_UN); 
vermeide ich doch aber einen gelichzeitigen Zugriff auf die Geschichte, oder!?
Mit Zitat antworten
  #8  
Alt 27.02.2006, 12:30:17
Giz Giz ist offline
Junior Member
 
Registriert seit: Apr 2005
Beiträge: 309
AW: fopen() ohne Überschreiben

Wenn es in der Regel funktioniert, dann plötzlich mal Daten löscht, kann ich Dir so erstmal auch nicht helfen. Ich sehe in dem Skript nichts über die Prüfung, ob ein neuer Monat vorliegt. Wie der alte $log_inhalt in die Variable kommt, kann ich auch nicht sehen... da liegt aber sicher der Fehler!

Überdenke mal den Aufbau der Datei. Als Trennzeichen wäre ein "|" auch ausreichend, wenn Du alle Variablen vor dem Schreiben auf das Vorkommen eines | überprüfst und es ggf. abänderst oder löschst.

Als Trennung für einen Eintrag würde sich ein einfaches "\n" anbieten. Das würde bedeuten, dass Du einen Zeilenvorschub in der Datei hast und sie bequem per file() als Array auslesen kannst, demzufolge auch bequem per array_reverse() umdrehen kannst z.B. die neuesten Einträge ganz vorn zu haben...
Sieh Dir mal das hier geschriebene an (erst die neuereren Beiträge)
Mit Zitat antworten
  #9  
Alt 27.02.2006, 12:31:30
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: fopen() ohne Überschreiben

Zitat:
Zitat von Heppi
vermeide ich doch aber einen gelichzeitigen Zugriff auf die Geschichte, oder!?
Du siehst doch, daß es ab und zu mal in die Hose geht.
Mit Zitat antworten
  #10  
Alt 27.02.2006, 12:38:42
Heppi Heppi ist offline
Anfänger
 
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
AW: fopen() ohne Überschreiben

Zitat:
Zitat von meikel
Du siehst doch, daß es ab und zu mal in die Hose geht.
Jetzt ist ein DBMS ja so gesehen aber auch nur ein Treiber, welcher die Zugriffe und alles auf die Datenbank verwaltet. Wie sieht da dann die unterste Treiberschicht aus? Wie wird hier vermieden, daß zwei gleichzeitige Zugriffe stattfinden?
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
fopen Parameter Franzx PHP Grundlagen 5 19.01.2006 12:30:02
fopen() - Sicherheitslücke? Gweilo Off Topic Area 2 18.01.2005 18:55:43
fopen mit url gibt fehler ?! kruschde PHP für Fortgeschrittene und Experten 3 14.12.2004 16:02:28
Probleme mit fopen andi_g PHP für Fortgeschrittene und Experten 0 13.03.2004 18:02:09
Problem mit Array und fopen() DeMaephis PHP für Fortgeschrittene und Experten 1 07.12.2002 12:50:58


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:52:18 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt