Frage zu fopen() bezüglich Dateisicherheit

Jukkales

Erfahrenes Mitglied
Hallo,

Ich schreibe mir garde eine kleine Textbasierende Datenbank und benötige ja auch Funktionen zum Speichern der Datenbanken. Da möchte ich aber einmal fragen:

PHP:
function SaveAccountList($Accountlist) {
	global $config;
	$fp = fopen($config['AccounDBFile'],'w');
	if(!$fp) return;
	for ($i = 0; $i < count($Accountlist); $i++)
		fputs($fp,sprintf("%s\t%s\t%d\t%d\t%s\t%d\n",$Accountlist[$i][0],$Accountlist[$i][1],$Accountlist[$i][2],$Accountlist[$i][3],$Accountlist[$i][4],$Accountlist[$i][5]));
	fclose($fp);
	return 1;
}

Diese Funktion öffnet die Datei und leert diese. In der Datei sind alle Accounts von den leuten gespeichert, Nun wollte ich fragen: Wie groß ist die warscheinlichkeit das die Funktion schief läuft und somit die Daten (teilweise) verloren sind?
 
Je nachdem wie groß die Datei ist und wielange der Vorgang in Anspruch nimmt (bei vielen Benutzern könnte ich mir schon vorstellen, dass es länger dauert) könnte es durch einen Zusammenbruch beim Server oder einen Hänger schon zu Timeouts kommen.

Die Frage die ich hätte, warum willst du die gesamte "Datenbank" leeren bevor du wieder hineinschreibst?
Warum kannst du Einträge nicht einfach anhängen?
 
Bim hinzufügen von Accounts wird auch einfach nur eine Zeile angehängt, ist schneller. Nur wenn ich einen Account aktualisieren will (Passwort ändern o.ä.) muss ich die vorgehenden Accounts schreiben dann den Aktualisierten und danach die restlichen, oder gibt es Funktionen zum Direkten änder einer Zeile? Ich kenne nur Funktionen aus BorlandC++ jedoch gibt es diese ja nicht in PHP
 
Arbeite doch mit SQLite, das ist eine dateibasierte Datenbank, für die nur eine Programmbibliothek benötigt wird. Derzeit ist die PHP-Implementierung dafür allerdings noch experimentell.

Andernfalls kannst du einfach die Zeilen abzählen und in der gewünschten Zeile anhalten.
PHP:
function fline( $handle, $linesToSkip )
{
	if( !is_int($linesToSkip) || $linesToSkip <= 0 ) {
		return false;
	}
	rewind($handle);
	while( !feof($handle) ) {
		$string = fgets($handle);
		if( $linesToSkip == 1 ) {
			break;
		}
		$linesToSkip--;
	}
	fseek($handle, -strlen($string), SEEK_CUR);
}

$handle =  fopen('./untitled.txt', 'a+');
fline($handle, 3);
var_dump(fgets($handle));
 
Naja SQLite is da sone sache .. Ich habe bereits versucht es zu benutzen jedoch merkert es ständig nur rum, Wenn die Datei da ist mit schreibrechten sagt es das die Datenbank nihct geöffnetw erden konnte, entzieh ich die Schreibrechte meckert es konnte zwar geöffnet werden aber es fehlen eben Schreibrechte usw.

Richtiges MySQL wollte ich vermeiden zu benutzen da ich damit sehr shclechte erfahrungen gemacht habe (was Transport und stabilität angeht).

Daher wollte ich ein Dateisystem wo ich jedoch nicht direkt einzelne Werte Updaten kann wie in SQL es muss jedesmal die Datei neugeschreiben werden.

Und Gumbo, deine Methode ist doch eigentlich nur für das Löschen von einträgen gebrauchbar oder seh ich das falsch?
 
Ich würde, wenn es den Aufwand erfordert, ein ordentliches Datenbanksystem jederzeit einer Lösung mit einfachen Textdateien vorziehen, da es aus meiner Sicht mehr Vor- als Nachteile hat. Welche schlechten Erfahrungen hast du denn gemacht dass du nun so skeptisch gegenüber Datenbankensystemen bist?

Die genannte Funktion setzt den Dateizeiger an den Anfang der angegebenen Zeile. Das nachfolgende Beispiel zeigt nur den Umgang damit. Möglicherweise gibt es auch noch effektivere Methoden.
 
Zurück