Сделайте проверки для кнопок отправки - PullRequest
0 голосов
/ 03 мая 2011

Я столкнулся с некоторыми проблемами, я хочу, чтобы этот скрипт:

  1. Открыть файл test.txt.
  2. Проверьте, добавил ли пользователь какой-либо текст в текстовый файл.
  3. Если пользователь добавил какой-либо текст, удалите существующую строку и замените ее новой. От $ _POST.
  4. Если пользователь этого не сделал, добавьте $ _POST в test.txt

Проблема:

Когда я спамлю кнопку отправки, текст .txt испортится. Кто-нибудь знает, как делать проверки, чтобы он не испортил? Пожалуйста, не предлагайте MYSQL, они мне нужны в .txt файле.

Спасибо.

function cutline($filename,$line_no=-1) { 

    $strip_return=FALSE; 

    $data=file($filename); 
    $pipe=fopen($filename,'w'); 
    $size=count($data); 

    if($line_no==-1) $skip=$size-1; 
        else $skip=$line_no-1; 

    for($line=0;$line<$size;$line++) 
        if($line!=$skip) 
            fputs($pipe,$data[$line]); 
        else 
            $strip_return=TRUE; 

    return $strip_return; 
} 


if ($userid = 1) {
    if(!isset($_POST['submit'])){
?>
        <center><form action="" method="POST">
            <b>HWID</b>
            <input type="text" name="HWID" />
            <input type="submit" value="Add HWID" name="submit">
            </form>
        </center>
<?php

    }else{

        $userid= 1;
        $userid = "user=" . $userid;

        $file = "test.txt";
        $lines = file($file);
        $count = 1;

        foreach ($lines as $e) {
            if(strpos($e, $userid) !== FALSE){
                cutline($file,$count);

                ++$count;


            }

        }
                $fh = fopen($file, 'a') or die("can't open file");
                $stringData = $userid . $_POST['HWID'] . "\n";
                fwrite($fh, $stringData);
        }
    }
}else{ 
    echo "You're not logged in";
}
?>

1 Ответ

0 голосов
/ 03 мая 2011

Я не уверен на 100%, как работает текстовый файл, но я думаю, что блокировка здесь не поможет, так как блокировки снимаются, когда скрипт завершен (или перезагружен).

Похоже, что выпросто "убейте" свой cutline во время выполнения, а остальные строки не будут записаны.Одним из способов решения этой проблемы может быть сохранение нового содержимого файла во временную переменную и вызов fwrite только один раз.(Я не уверен на 100%, сработает ли это)

Другая возможность - записать результаты cutline во временный файл и заменить старый файл новым, когда метод cutlineсделанный.Это может произойти внутри метода.

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

fwrite($fh, $stringData);

Я думаю, что этодействительно трудно форсировать, так как эта операция довольно быстрая.

РЕДАКТИРОВАТЬ:

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

...