Löschen Eintrag aus ZIP wenn veraltet

Eagle-PsyX-

Erfahrenes Mitglied
Hi,
ich bin relativ neu im Umgang mit PHP. Gerade eben hab ich für meine Internetseite eine Protokollierung intregiert, pro Login wird in die Datei Login.zip ein Eintrag verfasst wer/wann sich einloggte.

PHP:
$LoginZIP = new ZipArchive();
if ($LoginZIP->open("./Log/Login.zip", ZIPARCHIVE::CREATE)!==TRUE) {
	exit("cannot open <Login.zip>\n");
}
$EintragNameZIP = $SQLUser->ID . "-" . time() . ".txt";
$EintragInhaltZIP = "$SQLUser->ID|$SQLUser->Username|$ActDate|$ActTime|$SecureIP";
$LoginZIP->addFromString($EintragNameZIP, $EintragInhaltZIP);
$LoginZIP->close();

Folglich lautet dann ein Eintrag z.B: "1-1198305139.txt" und dessen Inhalt wäre dann
"1|Eagle|22.12.2007|07:32|127.0.0.1".

Funktioniert problemlos, nur jetzt komm ich ins Grübeln, was muss ich hinzufügen damit er Einträge der ZIP Datei die älter z.B. als 6 Monate sind löscht?
In MySQL ist es einfach(er) da ich sowas wie "WHERE `Time` <= '.(time() - 300)" dransetzten kann.
 
Zuletzt bearbeitet:
PHP:
<?php
$zip = new ZipArchive;
$zip->open('test.zip');

for($i = 0; $i < $zip->numFiles; $i++)
{
  echo $zip->getNameIndex($i).'<br>';
}
?>

So liest er dir z. B. alle Einträge aus. Jetzt müsstest du nur noch bei jedem Durchlauf der For Schleife prüfen, ob die Datei alt genug zum Löschen ist, usw.
 
Danke, ist vielleicht umständlich aber sollte funktionieren, tut es aber irgendwie nicht.
Er selektiert die "älteren" aus aber löscht sie nicht wirklich, bringt aber auch keine Fehlermeldung...

PHP:
$zip = new ZipArchive; 
$zip->open('Log\Login.zip'); 
for($i = 0; $i < $zip->numFiles; $i++) 
{
	$Teil = $teile = explode("-", $zip->getNameIndex($i)); //Selektiert das vor den "-" raus
	$Teil2 = explode(".txt", $Teil[1]);  //Selektiert das nach den ".txt" raus.
	$TimeListe = $Teil2[0];
  if($TimeListe <= time() - 300)
	{
		$T = $Teil[0]."-".$TimeListe.".txt";
		$zip->deleteName($T);
	}
echo $TimeListe.'<br>';
}
$zip->close();

Edit: Oh hat doch irgendwie grad geklappt
 
Zuletzt bearbeitet:
So ist kürzer.

PHP:
<?php
$zip = new ZipArchive;
$zip->open('test.zip');

for($i = 0; $i < $zip->numFiles; $i++)
{
  $timestamp = substr($string, strpos($string, '-') + 1, -4);
  if($timestamp <= time() -300)
  {
    $zip->deleteIndex($i);
  }
}
?>
Ist jetzt nicht getestet, sollte aber irgendwie so funktionieren ;)
 
Zuletzt bearbeitet:
Hab es nicht probiert, aber glaube nicht das es geht, denn vor dem "-" ist ja noch was was wegfallen muss, die BenutzerIdentität :-)

Die Zip Einträge lauten z.B:
21-1198305139.txt
BenutzerID - time.txt ;-)

Die Einträge werden wie folgt gespeichert:
PHP:
$EintragNameZIP = $SQLUser->ID . "-" . time() . ".txt";
Sonst läuft die Gefahr bei 'hunderten' Users dass 2x der gleiche Eintrag vorkommt => wird einer überschreiben ;-)
 
Zuletzt bearbeitet:
Mit PHP6 hätte es sogar funktioniert, auch wenn er immer noch zuviele Zeichen angezeigt hätte. [phpf]strstr[/phpf] bekommt den Parameter before_needle erst ab PHP6, leider.

Aber so wie es jetzt ist, sollte es auch funktionieren.

Code:
substr($string, strpos($string, '-') + 1, -4);

substr schneidet den String und zwar: An der Position des Bindestrichs +1, danit er eben danach abschneidet. Und am Ende 4 Stellen, eben ".txt".
 
Zuletzt bearbeitet:
Zurück