Pregunta

Estoy escribiendo una aplicación PHP que tiene un "panel de control" que escribe un archivo de preferencias con ciertas variables.En cada POST, si el archivo no existe, se crea.Si existe, es unlinked y un nuevo archivo es touched con el mismo nombre de archivo y nuevas variables.Este archivo luego se incluye en otra página y muestra el contenido según las variables que contiene.

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

¿Es esta una forma segura de escribir preferencias, siempre que este archivo se sobrescriba muchas veces al día?¿Cuál es una buena manera de alertar al usuario de este panel de control si el archivo no se guardó correctamente y, en ese caso, cuál sería un buen plan de contingencia para evitar romper la página en la que se incluye este archivo de preferencias sin definir un conjunto predeterminado de variables para completar si !(file_exists)?

¿Fue útil?

Solución

Si almacena su configuración en una matriz, puede serializarla () y escribirla en un archivo de texto, en lugar de escribir php sin formato en un archivo php e incluirlo.

Si no está desinfectando su entrada para esas preferencias y dice que $ mypref1 representa el nombre de alguien, no hay nada que le impida completarlo en el campo del formulario:

\"; echo \"PWNED

y su PHP resultante se convertirá

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

Entonces, en primer lugar, almacenar sus preferencias en una matriz y usar serialize () es mucho más seguro:

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

En su pregunta, también menciona que si el archivo existe, está desvinculado. Simplemente puede truncarlo a longitud cero pasando & Quot; w & Quot; como segundo argumento para fopen: no es necesario eliminarlo manualmente. Esto debería establecer el tiempo m de todos modos, negando la necesidad de que la llamada toque ().

Si los valores que se escriben en el archivo son preferencias, seguramente cada preferencia podría tener un valor predeterminado, a menos que haya cientos. array_merge le permitirá sobrescribir por clave, por lo que si hace algo como esto:

// 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 el problema es que hay montones, y no desea tener que inicializarlos a todos, podría tener un método get_preference que simplemente envuelva una llamada isset a la matriz de preferencias.

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

Sin embargo, más allá de todas las preguntas que esto plantea, la realidad es que con su aplicación, en el improbable caso de que algo no salga mal con el fopen, debe considerarse como un fallo grave de todos modos, y el puñado de usuarios que es probable que tenga que hacer uso de esta función se comunicarán con usted bastante rápido si algo sale mal.

Otros consejos

Siempre es mejor almacenar el estado de los usuarios en una sesión y solo persistir ese estado cuando sea necesario.

¿Por qué no usar las capacidades de truncamiento de fopen ()? Creo que en lugar de & Quot; r + & Quot ;, necesitará pasar & Quot; w + & Quot; ... Entonces, si el archivo existe, se truncará, si no solo crearás un nuevo archivo. Entonces el código se convierte en:

$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str); 
fclose ($handle);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top