2009-05-09 8 views
0

Ich schreibe eine PHP-App, die eine 'Systemsteuerung' hat, die eine Prefs-Datei mit bestimmten Variablen schreibt. Wenn die Datei nicht existiert, wird sie auf allen POST erstellt. Wenn es existiert, ist es unlinked und eine neue Datei ist touched mit dem gleichen Dateinamen und neuen Variablen. Diese Datei ist dann auf einer anderen Seite enthalten, auf der Inhalt basierend auf den darin enthaltenen Variablen angezeigt wird.Notfallplan für fopen Fehler in PHP

$file = "phpsettings.php"; 

if (!file_exists($file)) { 
    touch($file); 
    $handle = fopen ($file, 'r+'); 
$str = "<?php \$pref1 = \"$mypref\"; ?>"; 

} else { 

unlink($file); 
    touch($file); 
    $handle = fopen ($file, 'r+'); 
    $str = "<?php \$pref1 = \"$mypref\"; ?>"; 

} 

fwrite ($handle, $str); 
fclose ($handle); 

Ist dies eine sichere Methode zum Schreiben von Einstellungen, vorausgesetzt, diese Datei wird mehrmals am Tag überschrieben? Was ist eine gute Möglichkeit, den Benutzer dieser Systemsteuerung warnen, wenn die Datei nicht richtig gespeichert wurde, und in diesem Fall, was wäre ein guter Notfallplan, um die Seite zu brechen, die diese Prefs-Datei enthalten ist kurz vor der Definition einer Standardsatz von zu füllenden Variablen, wenn !(file_exists)?

+0

So ist Ihre Frage: "Ist es sicher, eine Datei zu verwenden, um den Zustand meiner Benutzer in meiner Anwendung zu speichern?" –

+0

Erwägen Hinzufügen von Flock-Anrufe nach dem fopen Anrufe. Http://www.php.net/flock – Powerlord

Antwort

2

Wenn Sie Ihre Einstellungen in einem Array speichern, können Sie sie serialisieren() und in eine Textdatei schreiben, anstatt rohe PHP in eine PHP-Datei zu schreiben und sie einzuschließen.

Wenn Sie nicht Ihre Eingabe für diese Präferenzen Hygienisierung und sagen $ mypref1 repräsentiert jemand Name, es gibt nichts, sie füllt diese aus in das Formularfeld zu stoppen:

\"; echo \"PWNED 

und Ihre resultierende PHP geworden

<?php \$pref1 = \"$mypref\"; echo \"PWNED\"; ?> 

Also erstens, Ihre Einstellungen in einem Array zu speichern und mit serialize() ist viel sicherer:

$prefs = array('mypref1' => 'somethingorother'); 
$handle = fopen ($file, 'w'); 
fwrite($handle, serialize($prefs)); 
fclose($h); 

// example code demonstrating unserialization 
$prefs2 = unserialize(file_get_contents($file)); 
var_dump($prefs == $prefs2); // should output "(bool) true" 

In Ihrer Frage erwähnen Sie auch, dass wenn die Datei existiert, es nicht verknüpft ist. Sie können es einfach auf Null Länge abschneiden, indem Sie "w" als zweites Argument für fopen übergeben - Sie müssen es nicht manuell löschen. Dies sollte die mtime trotzdem einstellen, was die Notwendigkeit des Anrufs zum Berühren() überflüssig macht.

Wenn die Werte, die in die Datei geschrieben werden, Voreinstellungen sind, kann jede Einstellung einen Standardwert haben, es sei denn, es gibt Hunderte? array_merge ermöglicht es Ihnen, auf einer Pro-Taste Basis zu überschreiben, wenn Sie also etwas tun, wie folgt aus:

// array of defaults 
$prefs = array(
    'mypref1' => 'pants', 
    'mypref2' => 'socks', 
); 
if (file_exists($file)) { 
    // if this fails, an E_NOTICE is raised. are you checking your server error 
    // logs regularly? 
    if ($userprefs = unserialize(file_get_contents($file))) { 
     $prefs = array_merge($prefs, $userprefs); 
    } 
} 

Wenn das Problem ist, dass es Haufen sind, und Sie wollen, dass sie nicht haben, zu initialisieren alle, Sie könnten eine get_preference-Methode verwenden, die einen isset-Aufruf einfach in das prefs-Array einfügt.

function get_preference($name, &$prefs) { 
    if (isset($pref[$name])) 
     return $pref[$name]; 
    return null; 
} 
var_dump(get_preference('mypref1', $prefs)); 

über alle Fragen dieses zwar erhöht, die Realität ist, dass mit Ihrer Anwendung in dem unwahrscheinlichen Fall, dass etwas mit den fopen falsch macht zu gehen, soll es als ein schwerwiegenden Fehler ohnehin angesehen werden, und Die Handvoll Benutzer, die Sie wahrscheinlich von dieser Funktion verwenden, werden Sie ziemlich schnell kontaktieren, wenn etwas schief geht.

+0

Ist diese Lösung noch notwendig, wenn (a) die Optionen Radiobuttons sind, nicht Textfelder-- ja sie sind noch manipulierbar, aber (b) vertraue ich der kleinen Gruppe von Leuten, die verwendet werden Dieses Formular? –

+0

Nicht genau, aber es kann eine gute Angewohnheit sein, Übung zu bilden, wenn nichts anderes, und ein gutes Stück Praxis bei der Verwendung von Techniken, um Injektionsprobleme zu mildern. – Shabbyrobe

0

Warum nicht einfach die Trunkierungsfunktionen von fopen() verwenden? Ich glaube, anstelle von "r +" müssen Sie "w +" übergeben ... Wenn die Datei existiert, wird sie abgeschnitten, wenn nicht, erstellen Sie einfach eine neue Datei. So wird der Code:

$file = "phpsettings.php"; 
$handle = fopen($file, 'w+'); 
$str = "<?php \$pref1 = \"$mypref\"; ?>"; 
fwrite ($handle, $str); 
fclose ($handle); 
0

Es ist immer besser, den Status des Benutzers in einer Sitzung zu speichern und diesen Status nur bei Bedarf beizubehalten.

+0

ich sollte geklärt haben - das ist nicht prefs für einzelne Benutzer, es ist prefs für, wie die Seite zu jedem aussehen wird " –

+0

So kann jeder Benutzer ein anderes Aussehen für die Seite festlegen? –

+0

Nein, ein autorisierter Benutzer sucht nach der Seite aus einer Reihe von vordefinierten Optionen. Die Welt sieht die Seite als der ein Benutzer definiert. –