Problem mit meinem Filesystem

Einstein-511

Mitglied
Hallo Leute,

Ich habe eine Frage zu meinem kleinen Filesystem. Er soll in ein File $key=$value schreiben. Macht er auch nur wen ich jetzt den key finde und mit dem neuen $value überschreiben will klappt das nicht. Vielleicht bin ich einfach nur blind.

Ein Beispiel:
mirm_dataSet("test.txt", "Klicks", $klicks); //Setzt in der Datei Klicks=Inhalt der Var $klicks
überschreibe ich das nun mit Beispielsweise:
mirm_dataSet("test.txt", "Klicks", "test");
hängt er es hinten herran. Ich denke ich habe das allgemein noch nicht optimal gelöst. Bin für jede Kritik offen =D. Er gibt mir auch ArrayErrors aus in den Lines die leer sind und in die ich nun hereinschreibe.

Ich danke euch schonmal im Vorraus für Tipps und Ratschläge.

Einstein
PHP:
//Alter Code, bitte runterscrollen für neuen Code
 
Zuletzt bearbeitet:
Dein Fehler liegt bei fopen. Indem du die Datei mittels a+ öffnest, wird der Zeiger am Ende der Datei positioniert, ergo es wird hinten angehängt.
Bei w+ wird die Datei überschrieben, da der interne Zeigeram anfang positioniert wird.
 
Danke, das hat schonmal geklappt. Nehme ich jetzt aber:

mirm_dataSet("test2.mirm", "bla", "test");
mirm_dataSet("test2.mirm", "42", "Var");
mirm_dataSet("test2.mirm", "bla", "test2");

schreibt er nur bla=test2, ohne die 42=Var bestehen zu lassen. Wo liegt jetzt das Problem.

Einstein
 
Weil es ganz einfach überschrieben wird.
Wenn du steuern möchtest wann es überschrieben werden soll, könntest du der Funktion einen weiteren Parameter anhängen, der bei true fopen per w+ und bei false fopen per a+ aufruft.
Oder habe ich dich jetzt falsch verstanden?
 
Er soll ja nach dem vorgehen

mirm_dataSet("test2.mirm", "bla", "test"); //bla = test exestiert noch nicht, wird also in die Datei geschrieben
mirm_dataSet("test2.mirm", "42", "Var"); // das gleiche wie bei bla
mirm_dataSet("test2.mirm", "bla", "test2"); //bla exestiert bereits, nun wird der werd test in test2 umgewandelt

so verstanden? :D
 
Im Prinzip hast du ja schon alles in deiner Funktion, was du brauchst. Es muss nur etwas rumgeschubst werden.

Erst zeilenweise einlesen und jede Zeile durch dein explode aufsplitten lassen, den Key nimmst du als Index eines Arrays und weist ihm den Value zu.

Danach überprüfst du ob der an die Funktion übergebene Key im Array schon existiert - ist das der Fall, änderst du lediglich den Value, anderen Falls fügst du ihn als neuen Index hinzu.

Das gesamte Array nun wieder in die File schreiben, fertig. :)
 
Ich hab die gesamte Funktion nun komplett überschrieben. Zur Zeit gibt es das Problem, dass er ab einer bestimmten einzutragenden Datenmenge auf einmal 1-5 Zeilen freilässt zwischen den Werten. Ich selber finde den Fehler nicht, vlt. findet es ja einer von euch *G*

PHP:
function mirm_dataSet($dataname, $key, $value) {
	if(mirm_exist($dataname) == true) {
	    $data = fopen($dataname, "r");
	    $numline = -1;
	    $replaceline = -1;
	    $ext = "";
	    $badreplace = false;
	    $numline = 0;
	    while(!feof($data)) {
	        $mem_backup = fgets($data, 4096);
	        $ext = strtok($mem_backup, "=");
	        if($mem_backup != "\r\n") {
		        if($key != $ext) {
		            $dataline[$numline] = $mem_backup;
				} else {
					$replaceline = $numline;
				}
				$numline++;
			}
		}
		fclose($data);
		unlink($dataname);
		$data = fopen($dataname, "w");
		for($i = 0; $i < $numline; $i++) {
		    if($i != $replaceline)
				fwrite($data, $dataline[$i]."\r\n");
			else {
			    fwrite($data, $key."=".$value."\r\n");
			    $badreplace = true;
			}
		}
		if($badreplace == false)
		    fwrite($data, $key."=".$value);
		fclose($data);
		return true;
	}
	return false;
}
 
Änder die if-Abfrage
PHP:
if($i != $replaceline)
mal in
PHP:
if($i != $replaceline && !empty( $dataline[$i] ) )

Das ist jetzt natürlich nur geraten, der Fehler kann auch im else-Zweig liegen.
Dann müsstest du aus diesem lediglich ein elseif machen und überprüfen, ob $key und $value gesetzt sind.
 
Zurück