2010-02-07 6 views
6

Tôi có một tệp config.inc trong một ứng dụng web mà tôi đang xây dựng. Nó chứa một mảng với các giá trị cấu hình cho những thứ như cơ sở dữ liệu MySQL, v.v. Tôi muốn chúng được nhập bằng cách sử dụng một biểu mẫu đơn giản, yêu cầu máy chủ, đăng nhập/mật khẩu cho cơ sở dữ liệu, v.v. tập tin cấu hình.PHP: Có phương pháp đúng để lưu dữ liệu cấu hình không?

Có phương pháp ưu tiên nào để thực hiện việc này không? Tôi không chắc chắn làm thế nào để ghi vào một tập tin, và cập nhật một mảng.

+0

bất cứ điều gì bạn làm tệp đó phải nằm ngoài đường dẫn của các trang web có thể xem để đảm bảo thông tin được bảo vệ tốt. –

+0

Có, tôi đã chắc chắn về điều đó, Apache không thể truy cập. –

+0

Làm thế nào bạn sẽ viết nó nếu Apache thậm chí không thể truy cập nó? :) –

Trả lời

2

Bạn chỉ muốn viết, đúng không? Nó là một mảng được tuần tự hóa hay nó được phân tích cú pháp?

Một cách để đọc tệp cấu hình là parse_ini_file(). Tôi sẽ không nhất thiết phải gọi nó là ưa thích, nhưng đó là một phương pháp. Bạn vẫn cần phải viết tệp.

Cách khác để viết "config.inc.php" và chỉ đưa nó vào, để viết nó, bạn chỉ cần xuất mã PHP thực tế (ví dụ: $ var = "myval";).

Đây là cách bạn có thể viết một hàm "đầu ra" đơn giản lấy một mảng giá trị cấu hình và xuất chúng dưới dạng giá trị name =, giả sử $ config là một mảng kết hợp.

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

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

Có rất nhiều cách để thực hiện điều đó. Nó thực sự dựa trên yêu cầu của bạn. Có phải cần để ở định dạng cụ thể hoặc bạn có bị mất nhiều thời gian không?

+0

Không, nó không cần phải ở định dạng tệp cụ thể. –

+0

Đối với các ứng dụng quy mô lớn, tôi thường sử dụng parse_ini_file() để phân tích cú pháp tệp cấu hình; hoặc bọc thông tin cần thiết trong một mảng hoặc tệp văn bản để phân tích cú pháp cho các công cụ nhanh chóng. –

0

Vâng, để viết một tệp, hàm fwrite() php thực hiện chính xác những gì bạn muốn. Từ trang tài liệu PHP.NET của nó (xem ví dụ bên dưới).

Bây giờ, khi đặt câu hỏi về nội dung xuất ra tệp đó - tôi giả sử tệp đó sẽ phải được bao gồm dưới dạng tệp .php cấu hình vào phần còn lại của dự án. Tôi tưởng tượng bạn sẽ làm điều gì đó như thế này - nơi bạn đang tạo chuỗi với mã PHP một cách nhanh chóng, dựa trên các hình thức nộp:

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

Và đây là đoạn mã cho 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

Giả sử các tệp config.inc của bạn trông như thế này:

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

Bạn muốn cập nhật nó, vì vậy bạn tạo ra một hình thức đơn giản, điền các lĩnh vực văn bản với giá trị hiện tại. Tập lệnh PHP ghi đè cấu hình hiện tại có thể trông giống như sau:

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

Và bạn đã hoàn tất.

+2

Đăng các giải pháp nguy hiểm như vậy kết thúc bằng "Và bạn đã hoàn tất" là vô trách nhiệm. –

+0

@Nic Hubbard: Vui lòng đảm bảo bạn xác thực tất cả dữ liệu nhập của người dùng và đảm bảo biểu mẫu điền dữ liệu này được bảo đảm 100% và chỉ có thể truy cập được với quản trị viên được ủy quyền. Hãy nhớ rằng tập tin này sau đó được bao gồm trong ứng dụng của bạn và tiêm mã độc vào nó thật đơn giản. –

+1

Nếu '$ newConfig' xuất phát từ nguồn đáng tin cậy và được xác thực hợp lệ, thì giải pháp này an toàn (tôi đã viết mã đó). Ngoài ra cho đến khi bạn viết một cái gì đó như thế này: 'include 'config.inc'; eval ($ config); 'khá khó để thực thi mã xấu. [var_export()] (http://pl.php.net/manual/en/function.var-export.php) sẽ biến bất kỳ mã xấu thành chuỗi bình thường, vì vậy kết quả cuối cùng sẽ giống như nếu bạn sẽ lưu cấu hình trong cơ sở dữ liệu. Vì vậy, xin vui lòng cho tôi một số ví dụ về tình hình thực sự nguy hiểm hoặc giải thích lý do tại sao bạn bỏ phiếu xuống. – Crozin

1

Bạn không nên sửa đổi tệp cấu hình PHP thông qua ứng dụng của mình, bạn nên sử dụng tệp CSV hoặc bảng cơ sở dữ liệu. Trong trường hợp bạn muốn lưu nó trong một tệp CSV thì tôi khuyên bạn nên giữ một tệp CSV cho mỗi loại cấu hình (e.tập tin g CSV cho cấu hình cơ sở dữ liệu) và luôn luôn ghi đè lên trước đó sử dụng file_put_contents

Lưu dữ liệu Ví dụ:

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

dữ liệu tải dụ:

$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

Tôi tin rằng sử dụng một tập tin này là một khôn ngoan tùy chọn, vì người dùng, mật khẩu, lược đồ, đường dẫn, v.v. là những thứ thường được sửa đổi bằng tay, do đó, việc sử dụng var_export không phải là do sửa đổi nó bằng tay không sạch sẽ và có thể làm hỏng ứng dụng của bạn nếu bạn mắc lỗi Cú pháp PHP.

Nhưng phân tích tệp ini lớn có thể tốn kém, do đó, bạn có thể lưu bộ nhớ cache ini bằng var_export() hoặc serlialize(). Đó là một lựa chọn tốt hơn, tôi nghĩ, và đọc ini chỉ khi tập tin bộ nhớ cache không tồn tại.

0

PHP có một chức năng chuyên dụng cho điều này, gọi nó var_export();

Chỉ cần làm:

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

tôi thích có một tập tin với một loạt các định nghĩa báo cáo.

Đây là các hằng số có sẵn trên toàn cầu (và tất nhiên không thay đổi) là những gì bạn cần cho cài đặt cấu hình.

Hằng số cung cấp quản lý bộ nhớ tốt hơn và hiệu quả trong việc đọc vì chúng không cần bộ nhớ bổ sung được yêu cầu bởi biến để có thể thay đổi.