Question

J'écris une application PHP dotée d'un "panneau de configuration" qui écrit un fichier de préférences avec certaines variables. Sur chaque POST, si le fichier n'existe pas, il est créé. S'il existe, il s'agit de unlinked et un nouveau fichier est touched avec le même nom de fichier et de nouvelles variables. Ce fichier est ensuite inclus sur une autre page avec un contenu d’affichage basé sur les variables qu’il contient.

$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); 

Est-ce un moyen sûr d’écrire les préférences, à condition que ce fichier soit écrasé plusieurs fois par jour? Quel est un bon moyen d'alerter l'utilisateur de ce panneau de contrôle si le fichier n'a pas été enregistré correctement, et dans ce cas, quel serait un bon plan d'urgence pour éviter de casser la page. Ce fichier prefs est inclus sans définir un ensemble par défaut de variables à remplir si !(file_exists)?

Était-ce utile?

La solution

Si vous stockez vos paramètres dans un tableau, vous pouvez les sérialiser () et les écrire dans un fichier texte au lieu d'écrire php brut dans un fichier php et l'inclure.

Si vous ne désinfectez pas vos entrées pour ces préférences et que vous dites que $ mypref1 représente le nom d'une personne, rien ne l'empêche de la remplir dans le champ du formulaire:

\"; echo \"PWNED

et votre PHP résultant deviendra

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

Tout d’abord, stocker vos préférences dans un tableau et utiliser serialize () est bien plus sûr:

$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"

Dans votre question, vous indiquez également que si le fichier existe, il est non lié. Vous pouvez simplement le tronquer à une longueur nulle en passant & Quot; w & Quot; comme second argument à fopen - vous n'avez pas besoin de le supprimer manuellement. De toute façon, cela devrait régler l’heure, ce qui évite à l’appel de toucher ().

Si les valeurs écrites dans le fichier sont des préférences, chaque préférence pourrait avoir une valeur par défaut, à moins qu'il y en ait des centaines. array_merge vous permettra d'écraser clé par clé, donc si vous faites quelque chose comme ça:

// 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);
    }
}

Si le problème est qu'il existe des tas et que vous ne voulez pas avoir à les initialiser tous, vous pouvez avoir une méthode get_preference qui enveloppe simplement un appel isset dans le tableau prefs.

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

Au-delà de toutes les questions que cela soulève, la réalité est que, avec votre application, dans le cas peu probable où quelque chose se produirait , le fopen ne fonctionnerait pas, cela devrait être considéré comme un grave échec, et les quelques utilisateurs que vous utiliserez probablement avec cette fonctionnalité vous contacteront très vite si quelque chose ne va pas.

Autres conseils

Il est toujours préférable de stocker l'état de vos utilisateurs dans une session et de ne conserver cet état qu'en cas de besoin.

Pourquoi ne pas simplement utiliser les capacités de troncature de fopen ()? Je crois qu'au lieu de & «; R + &» ;, vous aurez besoin de passer & «; W + &»; ... Ensuite, si le fichier existe, il sera tronqué, s'il ne Vous ne ferez que créer un nouveau fichier. Le code devient alors:

$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str); 
fclose ($handle);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top