2010-02-07 5 views
6

Mam plik config.inc w aplikacji internetowej, którą buduję. Zawiera tablicę z wartościami konfiguracyjnymi dla takich rzeczy, jak baza danych MySQL itp. Chciałbym, żeby były one wprowadzane za pomocą prostego formularza, który prosi o serwer, login/hasło do bazy danych itp., Następnie te są zapisywane do plik konfiguracyjny.PHP: Czy istnieje poprawna metoda zapisywania danych konfiguracyjnych?

Czy istnieje preferowana metoda robienia tego? Nie wiem, jak napisać do pliku i zaktualizować tablicę.

+0

cokolwiek robisz, plik powinien znajdować się poza ścieżkami widocznych stron internetowych, aby upewnić się, że informacje są dobrze chronione. –

+0

Tak, upewniłem się, że nie jest dostępne dla Apache. –

+0

Jak byś napisał, gdyby Apache nie mógł uzyskać do niego dostępu? :) –

Odpowiedz

2

Chcesz tylko pisać, prawda? Czy jest serializowaną tablicą, czy jest parsowana?

Jednym ze sposobów odczytania pliku konfiguracyjnego jest parse_ini_file(). Nie nazwałbym tego preferowanym, ale jest to metoda. Nadal będziesz musiał napisać plik.

Innym sposobem byłoby napisanie "config.inc.php" i po prostu uwzględnienie go, aby napisać, że właśnie wypiszesz aktualny kod PHP (np. $ Var = "myval";).

W ten sposób można napisać prostą funkcję "wyjściową", która pobierała tablicę wartości konfiguracyjnych i wyprowadzała je jako nazwa = wartość, zakładając, że $ config była tablicą asocjacyjną.

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

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

Istnieje wiele przyzwoitych sposobów na zrobienie tego. To naprawdę zależy od Twoich wymagań. Czy potrzebuje, aby być w określonym formacie, czy masz swobodę?

+0

Nie, to nie musi być w określonym formacie pliku. –

+0

Dla aplikacji na dużą skalę, zwykle używam parse_ini_file() do parsowania do pliku konfiguracyjnego; lub zawiń niezbędne informacje w tablicy lub pliku tekstowym, aby wykonać parsowanie dla szybko-brudnych rzeczy. –

0

Cóż, aby napisać plik, funkcja fwrite() php robi dokładnie to, co chcesz. Ze strony dokumentacji PHP.NET (patrz przykład poniżej).

Teraz, na pytanie, co do wyjścia do tego pliku - zakładam, że plik będzie musiał zostać dołączony jako plik konfiguracyjny .php do reszty projektu. Wyobrażam sobie, że zrobisz coś takiego - gdzie jesteś tworząc ciągi z kodu PHP na bieżąco, na podstawie złożonego formularza:

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

A oto fragment dla 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

Powiedzmy plik config.inc wygląda następująco:

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

chcesz go zaktualizować, więc utworzyć prosty formularz, wypełnić pola tekstowe z aktualnymi wartościami. Skrypt PHP, który nadpisuje bieżącą konfigurację, może wyglądać następująco:

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

I gotowe.

+2

Zamieszczanie takich niebezpiecznych rozwiązań zakończonych słowami "I gotowe" jest nieodpowiedzialne. –

+0

@Nic Hubbard: Upewnij się, że sprawdziłeś wszystkie dane wprowadzone przez użytkownika i upewnij się, że formularz do wypełnienia tych danych jest w 100% zabezpieczony i dostępny tylko dla upoważnionych administratorów. Pamiętaj, że ten plik jest następnie zawarty w aplikacji i wstrzyknięcie złośliwego kodu do niego jest cholernie proste. –

+1

Jeśli '$ newConfig' pochodzi z zaufanego źródła i jest poprawnie sprawdzone, to rozwiązanie jest bezpieczne (napisałem to w kodzie). Dopóki nie napiszesz czegoś takiego: 'include 'config.inc'; eval ($ config); 'bardzo trudno jest wykonać zły kod. [var_export()] (http://pl.php.net/manual/en/function.var-export.php) zamieni dowolny zły kod na zwykły ciąg znaków, więc ostateczny wynik będzie taki sam jak w przypadku zapisania konfiguracja w bazie danych. Proszę więc przedstawić mi przykład naprawdę niebezpiecznej sytuacji lub wyjaśnić, dlaczego głosowałeś. – Crozin

1

Nie zaleca się modyfikowania plików konfiguracyjnych PHP za pośrednictwem aplikacji, należy używać plików CSV lub tabel bazy danych. Jeśli chcesz zapisać go w pliku CSV, proponuję zachować plik CSV dla każdego typu konfiguracji (np.Plik g CSV dla konfiguracji baz danych) i zawsze zastępuje poprzednią użyciu file_put_contents

Zapisz przykład dane:

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

obciążenia przykład dane:

$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

wierzę użyciu pliku ini jest mądry opcja, ponieważ użytkownik, hasło, schemat, ścieżki itd. to rzeczy, które zwykle będą modyfikowane ręcznie, więc używanie var_export nie polega na tym, że modyfikowanie go ręcznie nie jest tak czyste i może spowodować awarię aplikacji, jeśli popełnisz błąd w Składnia PHP.

Ale parsowanie dużych plików ini może być kosztowne, więc byłoby w porządku buforowanie ini z var_export() lub serlialize(). Uważam, że jest to lepszy wybór i czytać ini tylko wtedy, gdy plik pamięci podręcznej nie istnieje.

0

PHP posiada dedykowaną funkcję dla tego, jego nazwie var_export();

Wystarczy zrobić:

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

wolę mieć plik z bandą określić oświadczenia.

Są to stałe dostępne na całym świecie (i oczywiście niezmienne), które są potrzebne do skonfigurowania ustawień.

Stałe oferują lepsze zarządzanie pamięcią i większą wydajność odczytu, ponieważ nie potrzebują dodatkowej pamięci wymaganej przez zmienną, aby można ją było zmienić.