Namen einer .txt vortaufend nummerieren
der Neue
- php
Hallo* :)
Ich habe eine Frage wozu ich die Lösung nicht finden kann.
Ich möchte Forumalsdaten in einer .txt Datei speichern, das funktioniert auch
Mit
$datei_name = 'angebot.txt';
lege ich den Namen fest
Mit
$fp = fopen($datei_name, "a+");
öffne ich die Datei schreibend
Mit
fwrite($fp, $daten .$shunt14. "" .$last14. "" .$anzahl14. "" .$shunt15. "" .$last15. "" .$anzahl15 ."\n");
schreibe ich Daten in die Datei
Und mit
fclose($fp);
schleiße ich die .txt dann wieder.
Jetzt heißt die Datei ja immer angebot.txt und wird immer wieder bei Nutzung überschrieben.
Ich würde aber gerne per PHP prüfen ob es schon eine angebot.txt gibt, wenn ja soll eine angebot1.txt angelegt werden. Wenn die angebot1.txt schon vorhaben dann halt die anbeot2.txt usw. usw.
Das mit den .txt Datei in PHP anlegen konnte ich noch googlen, verstehen und umsetzten. Leider finde ich nichts zu meiner Frage. Mir fehlen hier die Grundlagen.
Mag jemand helfen ?
Danke und Gruß
der Neue
hi,
nimm doch lieber file_get_contents() und file_put_contents().
überlege, ob du nicht lieber alle daten in eine textfile packen willst, mit serialize() und unserialize() kanns du ein Array entsprechend "verpacken".
oder du nennst deine dateien gleich 1000, 1001 u.s.w., das spart dir lästige strinoperationen. oder du "merkst" dir die anzahl der bereits gespeicherten dateien in einem extra file.
mit glob(*.txt) könntest du vermutlich auch zusammen mit count() die anzahl der existierenden txt-files in einem ordner herausbekommen.
mfg
tami
mit glob(*.txt) könntest du vermutlich auch zusammen mit count() die anzahl der existierenden txt-files in einem ordner herausbekommen.
Ungünstig. Kann zu Konflikten führen:
Das Skript holt für Benutzer A die Anzahl der Dateien.
Das Skript holt 2ms später für Benutzer B die Anzahl der Dateien.
Danach schreibt das Skript für Benutzer A die Inhalte und dann schreibt das Skript für Benutzer B die Inhalte in die gleiche Datei.
Ich würde deshalb dazu neigen entweder gleich eine Datenbank zu bemühen oder aber tempnam() zu verwenden. Um die Dateien dann fortlaufend zu haben genügt wohl die Sortierung nach der Erstellungszeit - die man mit filectime() heraus bekommen kann.
Tach!
Ich würde aber gerne per PHP prüfen ob es schon eine angebot.txt gibt, wenn ja soll eine angebot1.txt angelegt werden. Wenn die angebot1.txt schon vorhaben dann halt die anbeot2.txt usw. usw.
file_exists() prüft auf vorhandene Dateien. Eine freie Nummer zu finden geht mit einer Schleife, in der a) eine neue Nummer gebildet wird, b) daraus ein Dateiname gebildet wird und c) geprüft wird, ob solch eine Datei existiert. Die Suche dauert jedoch mit jeder neuen Date immer länger. Bei nur wenigen Dateien ist das kein Problem, wenn aber viele erwartet werden, könnte es zu einem werden. Bei sehr vielen wäre jedoch eine andere Art der Datenhaltung vermutlich sinnvoller (sprich Datenbank).
Leider finde ich nichts zu meiner Frage. Mir fehlen hier die Grundlagen.
Mit solchen kämest du zum Ziel. Stringverküpfungen und Schleifen sowie die genannte Funktion, mehr braucht es nicht. Für Grundlagenwissen lautet das Suchstichwort: PHP-Tutorial.
dedlfix.
Noch eine andere Variante wären Dateinamen mit aktuellem Datum und Zeit. Das wäre zwar nicht mehr fortlaufend, aber du kannst es trotzdem nach der Zeit sortieren wenn du die Datumsanteile in der richtigen Reihenfolge setzt und du musst nicht mit Schleifen arbeiten.
hi,
Ich würde aber gerne per PHP prüfen ob es schon eine angebot.txt gibt, wenn ja soll eine angebot1.txt angelegt werden.
Siehe Dein Thema: Fortlaufende Nummer erzeugen
Hotti
hi,
<?php
$textToSave = "abc";
$fileNr = 1;
while (file_exists("ausgabe" . $fileNr . ".txt")) {
$fileNr += 1;
}
file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);
mfg
tami
<?php
$textToSave = "abc";
$fileNr = 1;
while (file_exists("ausgabe" . $fileNr . ".txt")) {
$fileNr += 1;
}
file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);
>
Und was passiert, wenn eine Datei gelöscht wurde in der Reihe?
Ja, diese Lücke wird dann gefüllt.
Mit fortlaufender Nummerierung hat das nichts zu tun.
Das gilt im Übrigen auch dann, wenn z.B. die ersten 50, 100, 200 Dateien mal als Backup weggespeichert und gelöscht werden.
hi,
<?php
$textToSave = "abc";
$fileNr = 1;
while (file_exists("ausgabe" . $fileNr . ".txt")) {
$fileNr += 1;
}
file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);
> >
>
> Und was passiert, wenn eine Datei gelöscht wurde in der Reihe?
> Ja, diese Lücke wird dann gefüllt.
> Mit fortlaufender Nummerierung hat das nichts zu tun.
>
> Das gilt im Übrigen auch dann, wenn z.B. die ersten 50, 100, 200 Dateien mal als Backup weggespeichert und gelöscht werden.
Ja, ist doch klar, dass das "nur" ein (ausbaufähiger) Ansatz (!) ist. Du kannst genausogut die aktuelle Nummer mit
~~~php
file_put_contents("fileNr.ser",serialize($fileNr));
abspeichern.
Und mit
$lastFileNr = unserialize(file_get_contents("fileNr.ser"));
einlesen.
Du kannst auch die Filenamen alle auslesen, die die Nummer zwischen "ausgabe" und ".txt" rauslesen, indem Du zB. "ausgabe" und ".txt" in den Filenamen löscht und so eine Methode oder Funktion bauen, die Dir angibt, welche Nummer bei einer eventuell fortlaufenden Nummerierung fehlen. Und damit dann entsprechend umgehen.
mfg
tami
hi,
<?php
$textToSave = "abc";
$fileNr = 1;
while (file_exists("ausgabe" . $fileNr . ".txt")) {
$fileNr += 1;
}
file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);
> >
>
> Und was passiert, wenn eine Datei gelöscht wurde in der Reihe?
> Ja, diese Lücke wird dann gefüllt.
> Mit fortlaufender Nummerierung hat das nichts zu tun.
>
> Das gilt im Übrigen auch dann, wenn z.B. die ersten 50, 100, 200 Dateien mal als Backup weggespeichert und gelöscht werden.
~~~php
<?php
$textToSave = "abc";
$fileNr = 1;
foreach(glob("ausgabe*.txt") as $fileName) {
$fileNameNr = str_replace(array("ausgabe",".txt"), "", $fileName);
if($fileNameNr > $fileNr) {
$fileNr = $fileNameNr;
}
}
$fileNr += 1;
file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);
mfg
tami