Frage

Ich schreibe eine PHP-Anwendung, die eine ‚Control Panel‘ hat, die eine Prefs-Datei mit bestimmten Variablen schreibt. Auf jedem POST, wenn die Datei nicht existiert, wird es erstellt. Wenn es nicht vorhanden ist, ist es unlinked und eine neue Datei mit dem gleichen Dateinamen und neuen Variablen touched. Diese Datei wird dann mit Anzeigen Inhalt auf anderen Seiten eingebunden sind, basierend auf den Variablen in seinem Inneren.

$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 Art und Weise des Schreibens Präferenzen, sofern diese Datei mehrmals pro Tag überschrieben werden? Was ist eine gute Möglichkeit, sowohl die Benutzer dieses Bedienfeld alarmieren, wenn die Datei nicht korrekt gespeichert wurde, und in diesem Fall, was wäre ein guter Notfallplan sein der Seite diese Prefs Datei zu vermeiden, bricht auf kurze enthalten ist eine der Definition Standardsatz von Variablen, wenn !(file_exists) zu füllen?

War es hilfreich?

Lösung

Wenn Sie Ihre Einstellungen in einem Array speichern, können Sie serialisiert (), um sie und schreiben in eine Textdatei, anstatt roh PHP zu einer PHP-Datei schreiben und einschließlich es.

Wenn Sie Hygienisierung nicht Ihre Eingabe für die Vorlieben und mypref1 $ sagen stellt jemand den Namen, es gibt nichts, sie füllt diese aus in das Formularfeld zu stoppen:

\"; echo \"PWNED

und Ihre resultierende PHP werden

<?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, die Sie erwähnen auch, dass, wenn die Datei nicht existiert, es nicht verknüpft ist. Sie können einfach auf Null Länge gestutzt, indem „w“ als das zweite Argument von fopen - Sie müssen nicht, um es manuell zu löschen. Dies sollte die mtime ohnehin gesetzt ist, negiert die Notwendigkeit für den Anruf zu berühren ().

Wenn die Werte in die Datei geschrieben werden Präferenzen sind, sicherlich jede Präferenz eine Standard haben könnte, es sei denn, es Hunderte sind? array_merge ermöglicht es Ihnen, auf einer Pro-Taste Basis zu überschreiben, wenn Sie also etwas tun:

// 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 nicht zu haben, sie alle zu initialisieren, Sie könnten eine get_preference Methode haben, die gerade einen isset Anruf Wraps auf die Prefs-Array.

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

Darüber hinaus alle Fragen dieses zwar erhöht, ist die Realität, dass mit Ihrer Anwendung, in dem unwahrscheinlichen Fall, dass etwas hat schief gehen mit der fopen, sollte es als ein schwerwiegender Fehler angesehen werden, wie auch immer, und die Handvoll Benutzer die Sie wahrscheinlich haben von dieser Funktion Gebrauch machen werden werden Sie verflixt schnell in Kontakt, wenn etwas schief geht.

Andere Tipps

Es ist immer besser, Ihre Benutzer zu speichern Zustand in einer Sitzung und nur diesen Zustand bestehen bleiben, wenn nötig.

Warum nicht nur die Abschneide Fähigkeiten von fopen () verwenden? Ich glaube, statt „r +“, müssen Sie „w +“ passiert ... Dann, wenn die Datei vorhanden ist, wird es abgeschnitten werden, wenn es Sie nicht nur eine neue Datei erstellen. So ist der Code wird:

$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str); 
fclose ($handle);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top