2010-02-07 7 views
6

Ho un file config.inc in un'applicazione Web che sto creando. Contiene un array con valori di configurazione per cose come il database MySQL, ecc. Vorrei che questi fossero inseriti usando un semplice modulo, che richiede il server, login/password per il database, ecc, quindi questi vengono scritti nel file di configurazione.PHP: esiste un metodo corretto per il salvataggio dei dati di configurazione?

Esiste un metodo preferito per farlo? Non sono sicuro di come scrivere su un file e aggiornare un array.

+0

qualsiasi cosa tu faccia quel file dovrebbe essere fuori dal percorso delle pagine web visualizzabili per assicurarsi che le informazioni siano ben protette. –

+0

Sì, l'ho verificato, non è accessibile da Apache. –

+0

Come scriveresti se Apache non può nemmeno accedervi? :) –

risposta

2

Vuoi solo scrivere, correggere? È un array serializzato o è analizzato?

Un modo per leggere un file di configurazione è parse_ini_file(). Non lo chiamerei necessariamente preferito, ma è un metodo. Dovresti ancora scrivere il file.

Un altro modo per scrivere un "config.inc.php" e semplicemente includerlo, per scriverlo si dovrebbe semplicemente produrre un codice PHP reale (ad es. $ Var = "myval";).

Questo è un modo per scrivere una semplice funzione "output" che ha preso una serie di valori di configurazione e li ha emessi come nome = valore, assumendo che $ config fosse un array associativo.

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

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

Ci sono molti modi decenti per farlo. È davvero basato sulle tue esigenze. ha bisogno di per essere in un formato specifico o hai margine di manovra?

+0

No, non è necessario che sia in un formato di file specifico. –

+0

Per le applicazioni su larga scala, di solito utilizzo parse_ini_file() per analizzare il file di configurazione; o avvolgere le informazioni necessarie in un array o in un file di testo per eseguire il parsing di materiale quick-n-dirty. –

0

Bene, per scrivere un file, la funzione fwrite() php fa esattamente ciò che si desidera. Dalla sua pagina di documentazione PHP.NET (vedi esempio sotto).

Ora, sulla questione di cosa produrre in quel file, presumo che il file debba essere incluso come file di configurazione .php nel resto del progetto. Sto immaginando che farai qualcosa come questo - dove si sta creando stringhe con codice PHP al volo, sulla base della forma presentata:

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

Ed ecco il frammento per 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

Diciamo che il file config.inc assomiglia a questo:

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

si desidera aggiornare, quindi si crea una forma semplice, compila i campi di testo con i valori attuali. Lo script PHP che sovrascrive la configurazione corrente potrebbe essere il seguente:

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

E il gioco è fatto.

+2

La pubblicazione di tali soluzioni pericolose che terminano con "E il gioco è fatto" è irresponsabile. –

+0

@Nic Hubbard: assicurati di convalidare tutti gli input dell'utente e assicurati che il modulo per il riempimento di questi dati sia protetto al 100% e accessibile solo agli amministratori autorizzati. Ricorda che questo file è quindi incluso nella tua applicazione e l'inserimento di codice dannoso in esso è dannatamente semplice. –

+1

Se '$ newConfig' proviene da una fonte attendibile e viene convalidato correttamente, allora questa soluzione è sicura (l'ho scritta nel codice). Inoltre, finché non scrivi qualcosa come questo: 'include 'config.inc'; eval ($ config); 'è piuttosto difficile eseguire codice cattivo. [var_export()] (http://pl.php.net/manual/en/function.var-export.php) trasforma qualsiasi codice errato in una stringa normale, quindi il risultato finale sarà lo stesso come se salvi il tuo configurazione nel database. Quindi, per favore, presentami qualche esempio di situazione veramente pericolosa o spiega perché hai votato. – Crozin

1

Non è consigliabile modificare i file di configurazione di PHP tramite l'applicazione, è necessario utilizzare i file CSV o una tabella di database. Nel caso in cui si desideri salvarlo in un file CSV, suggerisco di conservare un file CSV per ogni tipo di configurazione (ad es.File g CSV per le configurazioni del database) e sempre sovrascrivere la precedente utilizzando file_put_contents

Salva dati esempio:

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

Carica esempio dati:

$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

Credo che utilizza un file ini è un saggio opzione, perché utente, password, schema, percorsi, ecc. sono cose che di solito saranno modificate a mano, quindi usare var_export non è perché modificarlo a mano non è così pulito e potrebbe mandare in crash la tua applicazione se commetti un errore Sintassi PHP

Tuttavia, l'analisi di file ini di grandi dimensioni può essere costosa, quindi sarebbe opportuno memorizzare l'ini con var_export() o serlialize(). È una scelta migliore, penso, e leggo il ini solo quando il file cache non esiste.

0

PHP ha una funzione dedicata per questo, la sua chiamata var_export();

Basta fare:

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

preferisco avere un file con un mazzo di definire istruzioni.

Queste sono costanti disponibili globalmente (e ovviamente immutabili), che è ciò che è necessario per le impostazioni di configurazione.

Le costanti offrono una migliore gestione della memoria ed efficienza nella lettura in quanto non richiedono la memoria aggiuntiva richiesta da una variabile per poter essere modificata.

Problemi correlati