2010-02-07 8 views
6

Tengo un archivo config.inc en una aplicación web que estoy creando. Contiene una matriz con valores de configuración para cosas como la base de datos MySQL, etc. Me gustaría que se ingresen usando un formulario simple, que solicite el servidor, inicio de sesión/contraseña para la base de datos, etc., luego estos se escriben en el archivo de configuración.PHP: ¿Existe un método correcto para guardar los datos de configuración?

¿Existe un método preferido para hacer esto? No estoy seguro de cómo escribir en un archivo y actualizar una matriz.

+0

haga lo que haga, ese archivo debe estar fuera del camino de las páginas web visibles para asegurarse de que la información esté bien protegida. –

+0

Sí, me aseguré de eso, no es accesible por Apache. –

+0

¿Cómo lo escribirías si Apache ni siquiera puede acceder a él? :) –

Respuesta

2

Solo quiere escribir, ¿correcto? ¿Es una matriz serializada o se analiza?

Una forma de leer un archivo de configuración es parse_ini_file(). No necesariamente lo llamaría preferido, pero es un método. Aún necesitarías escribir el archivo.

Otra forma sería escribir un "config.inc.php" y simplemente incluirlo en, para escribirlo simplemente generaría un código PHP (por ejemplo, $ var = "myval";).

Esta es una forma en que podría escribir una función de "salida" simple que tomó una matriz de valores de configuración y los dio como nombre = valor, suponiendo que $ config era una matriz asociativa.

foreach ($config as $name => $value) { 
    $output .= $name . '=' . $value . "\n"; 
} 

if (!file_put_contents($filename, $output)) { 
    die("Error writing config file."); 
} 

Hay muchas formas decentes para hacerlo. Realmente se basa en tus requisitos. ¿Es necesario para estar en un formato específico o tiene margen de maniobra?

+0

No, no necesita estar en un formato de archivo específico. –

+0

Para aplicaciones a gran escala, generalmente uso parse_ini_file() para analizar el archivo de configuración; o envuelva la información necesaria en una matriz o archivo de texto para hacer el análisis de cosas rápidas y sucias. –

0

Bueno, para escribir un archivo, la función fwrite() php hace exactamente lo que usted desea. Desde su página de documentación PHP.NET (ver ejemplo a continuación).

Ahora, en la pregunta sobre qué mostrar en ese archivo, asumo que el archivo deberá incluirse como un archivo de configuración .php en el resto del proyecto. Me estoy imaginando que va a hacer algo como esto - donde se va a crear cadenas con código PHP sobre la marcha, basado en el formulario presentado:

$strDatabaseConfig = "\$databaseConfig = array('" . $_POST['login'] . "," . $_POST['password'] . "');"; 

Y aquí está el fragmento de fwrite:

$filename = 'test.txt'; 
$somecontent = "Add this to the file\n"; 

// Let's make sure the file exists and is writable first. 
if (is_writable($filename)) { 

    // In our example we're opening $filename in append mode. 
    // The file pointer is at the bottom of the file hence 
    // that's where $somecontent will go when we fwrite() it. 
    if (!$handle = fopen($filename, 'a')) { 
     echo "Cannot open file ($filename)"; 
     exit; 
    } 

    // Write $somecontent to our opened file. 
    if (fwrite($handle, $somecontent) === FALSE) { 
     echo "Cannot write to file ($filename)"; 
     exit; 
    } 

    echo "Success, wrote ($somecontent) to file ($filename)"; 

    fclose($handle); 

} else { 
    echo "The file $filename is not writable"; 
} 
-4

Digamos que su archivo config.inc se ve así:

$config = array(
    'blah' => 'mmm', 
    'blah2' => 'www', 
    //... 
); 

desea actualizar, así que se crea un formulario simple, rellene los campos de texto con los valores actuales. El script PHP que sobrescribe la configuración actual podría verse así:

$newConfig = ...; // data from form - of course validate it first 
$config = ...; // data from config.inc 

$config = array_merge($config, $newConfig); 
file_put_contents('config.inc', '<?php $config = ' . var_export($config, true)); 

Y listo.

+2

Publicar estas soluciones peligrosas que terminan con "Y listo" es irresponsable. –

+0

@Nic Hubbard: asegúrese de validar todas las entradas de los usuarios y asegúrese de que el formulario para completar esta información esté 100% seguro y solo accesible para administradores autorizados. Recuerde que este archivo se incluye en su aplicación e inyectar código malicioso en él es muy simple. –

+1

Si '$ newConfig' proviene de una fuente confiable y se valida correctamente validada, entonces esta solución es segura (lo escribí en el código). También hasta que escriba algo como esto: 'include 'config.inc'; eval ($ config); 'es bastante difícil ejecutar código incorrecto. [var_export()] (http://pl.php.net/manual/en/function.var-export.php) convertirá cualquier código incorrecto en una cadena normal, por lo que el resultado final será el mismo que si guardara su configuración en la base de datos. Así que por favor, presente un ejemplo de situación realmente peligrosa o explique por qué votó en contra. – Crozin

1

No se recomienda modificar los archivos de configuración de PHP a través de su aplicación, debe usar archivos CSV o una tabla de base de datos. En caso de que quiera guardarlo en un archivo CSV, le sugiero que guarde un archivo CSV para cada tipo de configuración (p.archivo g CSV para configuraciones de bases de datos) y siempre sobrescribe la anterior usando file_put_contents

Guardar datos de ejemplo:

$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it 
$csvData = array(); 

foreach ($csvStructure as $field) { 
    $csvData[] = $_POST[$field]; // so it'd get $_POST["dbUser"],$_POST["dbPasword"], etc.. 
} 
file_put_contents("filename",implode("\t",$csvData)); 

Cargar ejemplo de datos:

$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it 
$dbConfig = array(); 
$csvData = explode("\t",file_get_contents("filename"));  
foreach ($csvStructure as $key => $field) { // $key would have the location of the requested field in our CSV data (0,1,2, etc..). 
    $dbConfig[$field] = $csvData[$key]; // populate $dbConfig["dbUser"],$dbConfig["dbPasword"], etc.. 
} 
1

Creo con un archivo ini es una sabia opción, porque el usuario, la contraseña, el esquema, las rutas, etc. son cosas que generalmente se modificarán a mano, por lo que usar var_export no es porque modificarlo a mano no es tan limpio y puede bloquear su aplicación si comete un error en el Sintaxis PHP

Pero el análisis de archivos ini grandes puede ser costoso, por lo que estaría bien almacenar en caché el ini con var_export() o serlialize(). Es una mejor opción, creo, y lee la ini solo cuando el archivo de caché no existe.

0

PHP tiene una función específica para este, se llama var_export();

Just Do:

file_put_contents("config.php",var_export($config,true)); 
0

Yo prefiero tener un archivo con un montón de definir sentencias.

Son constantes disponibles en todo el mundo (y, por supuesto, inmutables) que es lo que necesita para la configuración.

Las constantes ofrecen una mejor gestión de la memoria y una mayor eficacia en la lectura, ya que no necesitan la memoria adicional requerida por una variable para poder cambiarla.

Cuestiones relacionadas