Можно ли улучшить этот код PHP? - PullRequest
2 голосов
/ 24 августа 2011

То, чего я хочу достичь, это в основном установка переменных из данных, введенных через мою форму (эти переменные затем используются на моем веб-сайте). Я не беспокоюсь о безопасности, поскольку я единственный, кто имеет доступ к форме.

Итак, на данный момент я использую fwrite для сохранения данных в отдельных файлах, а затем использую file_get_contents для каждой переменной. Данные из формы маленькие, одно или два слова для каждого поля.

Я не могу использовать базу данных, поэтому ниже приведен пример того, чем я сейчас занимаюсь, можно ли ее улучшить или есть ли другие способы добиться этого?

<?php

if(isset($_REQUEST['sub']))
{
$myFile = "first.php";
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = $_REQUEST['first'];
$string = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $stringData);
fwrite($fh, $string);
fclose($fh);

$myFile_second = "second.php";
$fh2 = fopen($myFile_second, 'w') or die("can't open file2");
$stringData2 = $_REQUEST['second'];
$string2 = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $stringData2);
fwrite($fh2, $string2);
fclose($fh2);

$myFile_third = "third.php";
$fh3 = fopen($myFile_third, 'w') or die("can't open file3");
$stringData3 = $_REQUEST['third'];
$string3 = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $stringData3);
fwrite($fh3, $string3);
fclose($fh3);
}

$first = file_get_contents ("first.php");
$second = file_get_contents ("second.php");
$third = file_get_contents ("third.php");

?>

<form method="post" name="installer">

<div id="field">
<label>First</label>
<input type="text" name="first" value="<?php echo $first; ?>" />
</div>

<div id="field">
<label>Second</label>
<input type="text" name="second" value="<?php echo $second; ?>" />
</div>

<div id="field">
<label>Third</label>
<input type="text" name="third" value="<?php echo $third; ?>" />
</div>

<div id="submit">
<input type="submit" value="Save" name="sub" />
</div>

</form>

Любые предложения будут высоко оценены, спасибо:)

Обновление

Ну, спасибо всем за вашу помощь и предложения. Теперь я реализовал нечто похожее на приведенное ниже, и я должен сказать, что это прекрасно работает!

<?
if (isset($_REQUEST['sub'])) {

    $files_data = array(
        'first' => &$_REQUEST['first'],
        'second' => &$_REQUEST['second'],
        'third' => &$_REQUEST['third']
    );

    $files_data = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]+/", "", $files_data);

    file_put_contents('data.txt', serialize($files_data)) !== FALSE or die("Can't write to file!" . PHP_EOL);
    } 

$files_data = unserialize(file_get_contents('data.txt'));

$first = $files_data[first];
$second = $files_data[second];
$third = $files_data[third];

?>

<form method="post" name="installer">
<div id="field">
<label>First</label>
<input type="text" name="first" value="<?php echo $first; ?>" />
</div>
<div id="field">
<label>Second</label>
<input type="text" name="second" value="<?php echo $second; ?>" />
</div>
<div id="field">
<label>Third</label>
<input type="text" name="third" value="<?php echo $third; ?>" />
</div>
<div id="submit">
<input type="submit" value="Save" name="sub" />
</div>
</form>

Ответы [ 7 ]

3 голосов
/ 24 августа 2011

Я полагаю, что вы делаете это для постоянства (т. Е. Веб-сервер перезагружается, и вы хотите, чтобы ваши данные были там, как только они будут восстановлены)? Поэтому, если вы застряли в написании, чтении и разборе множества файлов, вам будет сложно сэкономить огромное количество времени при выполнении.

Вы можете взглянуть на fscan и посмотреть, не сделает ли это чтение немного быстрее для вас.

Кроме этого, я рекомендую вам кэшировать данные после того, как вы проанализировали файлы, чтобы вам не приходилось делать это снова и снова, и только повторно сканируйте их после изменения файлов. Вы можете отслеживать это по контрольной сумме или просмотру файлов с измененной отметкой времени.

Один из способов «упростить» это сохранить сохраненные данные в массиве 1016 * и , сериализующем , и сохранить их в файл. Тогда вы можете прочитать весь файл за один раз и отменить сериализацию , и вы получите свой массив с данными обратно.

Быстрый и грязный способ сохранить массив в файл будет выглядеть примерно так:

file_put_contents('mydatafile', serialize($myArray)));

и вернуть массив

$myArray = unserialize(file_get_contents('mydatafile'));
1 голос
/ 24 августа 2011

Это всего лишь небольшая модификация кода @Austin Brunkhorst. Извините, слишком много, чтобы оставлять комментарии.

if (isset($_REQUEST['sub'])) {
    //No need to copy variables
    $files_data = array(
        'first' => &$_REQUEST['first'],
        'second' => &$_REQUEST['second'],
        'third' => &$_REQUEST['third']
    );
    //Note that you should use '+' at the end of match
    //so that preg can match more the one character at once,
    //it is much faster. And we can apply it once to whole array.
    $files_data = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]+/", "", $files_data);
    //Note '&' in foreach to disable variable copying
    foreach ($files_data as $filename => &$request_str) {
        //Why use complex fwrite when we have a ready function to write to file?
        file_put_contents($filename . '.php', $request_str) !== FALSE or die("Can't write to file '$filename'!" . PHP_EOL);
        //We don't need to read files again when we already have our string
        //It is ugly, but fun! Maby this should be avoided :)
        $$filename = $request_str;
    }
} else {
    $first = file_get_contents("first.php");
    $second = file_get_contents("second.php");
    $third = file_get_contents("third.php");
}
1 голос
/ 24 августа 2011
<?
if (isset($_REQUEST['sub'])) {
    # MAKE SURE YOUR FORM IS WELL PROTECTED !
    file_put_contents("first.php",  preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $_REQUEST['first']));
    file_put_contents("second.php", preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $_REQUEST['second']));
    file_put_contents("third.php", preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $_REQUEST['third']));
}    
?>
<form method="post" name="installer">
<div id="field">
<label>First</label>
<input type="text" name="first" value="<?php echo file_get_contents("first.php"); ?>" />
</div>
<div id="field">
<label>Second</label>
<input type="text" name="second" value="<?php echo file_get_contents("second.php"); ?>" />
</div>
<div id="field">
<label>Third</label>
<input type="text" name="third" value="<?php echo file_get_contents("third.php"); ?>" />
</div>
<div id="submit">
<input type="submit" value="Save" name="sub" />
</div>
</form>
1 голос
/ 24 августа 2011
<?php

function do_file_operation($filename,$field_name)
{
    $myFile = $filename;
    $fh = fopen($myFile, 'w') or die("can't open file");
    $stringData = $_POST[$field_name];
    $string = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $stringData);
    fwrite($fh, $string);
    fclose($fh);
}


if(isset($_POST['sub']))
{

    do_file_operation("first.php","first");
    do_file_operation("second.php","second");
    do_file_operation("third.php","third");

}

$first = file_get_contents ("first.php");
$second = file_get_contents ("second.php");
$third = file_get_contents ("third.php");

?>

<form method="post" name="installer">

<div id="field">
<label>First</label>
<input type="text" name="first" value="<?php echo $first; ?>" />
</div>

<div id="field">
<label>Second</label>
<input type="text" name="second" value="<?php echo $second; ?>" />
</div>

<div id="field">
<label>Third</label>
<input type="text" name="third" value="<?php echo $third; ?>" />
</div>

<div id="submit">
<input type="submit" value="Save" name="sub" />
</div>

</form>
1 голос
/ 24 августа 2011

Это должно сработать.

<?php

if( isset($_REQUEST['sub']) ){

$files = array(
    'first.php'  => $_REQUEST['first'],
    'second.php' => $_REQUEST['second'],
    'third.php'  => $_REQUEST['third']
);  

foreach($files as $file => $request){
    $fh = fopen($file,'w') or die("can't open file ". $file);
    $string = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $request);
    fwrite($fh, $string);
    fclose($fh);
}

}

$first = file_get_contents ("first.php");
$second = file_get_contents ("second.php");
$third = file_get_contents ("third.php");

?>

Но, как уже было сказано выше, гораздо эффективнее использовать базы данных.

1 голос
/ 24 августа 2011

вы можете использовать php сессии для хранения и получения значений. http://www.w3schools.com/php/php_sessions.asp

Во-вторых, вы можете использовать SplFileInfo вместо fopen, fwrite

$myFile = 'foo.txt';
$file = new SplFileInfo($myFile);
$lines = $file->openFile('w');
0 голосов
/ 24 августа 2011

Если вы просто хотите включить код в свой проект, вы можете использовать eval :

$includes = array('first', 'second', 'third');
foreach ($includes as $value) {
    $code = preg_replace("/[^a-zA-Z0-9.:,=?%\/\\s]/", "", $_REQUEST[$value]);
    if (!eval($code))
        die('Parse Error in $_REQUEST["'.$value.'"]');
}

Как уже отмечалось, это оставляет вас широко открытыми для любой атаки, поэтомууверен, что вы действительно защитите скрипт, например, с помощью .htaccess-файла .

...