2013-02-01 101 views
1

我正面臨以下問題。我有一個簡單的textarea,用戶將用它來提交隨後寫入服務器文本文件的文本。這是行得通的。PHP刷新時如何清除內存

但是,當我刷新頁面時,它將最後添加的文本添加到文本文件中,導致重複條目。

任何想法我必須做什麼來防止這種情況?以下是我用於textarea部分的代碼。

<html> 
    <body> 
     <form name="form" method="post"> 
      <input type="text" name="text_box" size="50"/> 
      <input type="submit" id="search-submit" value="submit" /> 
     </form> 
    </body> 
</html> 
<?php 
    if(isset($_POST['text_box'])) { 
     $a = $_POST['text_box']; 
     $myFile = "textfile.txt"; 
     $fh = fopen($myFile, 'a+') or die("can't open file"); 
     fwrite($fh, $a."\r\n"); 
     fclose($fh); 
    } 
?> 

在此先感謝那些通過POST加載

+0

順便說一句:'file_put_contents($ MYFILE, 「$ A \ r \ n」,FILE_APPEND | LOCK_EX);' –

+0

如何使用DB – 2013-02-01 02:59:58

回答

1

頁面會導致瀏覽器要求用戶重新提交的信息,查看導致該網頁再次發生執行的操作的頁面。如果通過GET請求頁面並在查詢字符串中包含變量,則會發生同樣的情況,但是會默默無聞地(無需用戶再次提示)。

最好的解決辦法是使用POST/REDIRECT/GET pattern。我在一個關於processing payments that I wrote for Authorize.Net的例子中使用了它。希望這點能讓你朝着正確的方向前進。

+0

IIRC,授權實際上是防範這個潛在的問題......不用說,它不應該發生在第一位:) –

0

更簡單如此 您可以在會話中存儲簡單的散列並每次重新生成一次。 當用戶重新加載頁面時,php不會被執行。

<?php 
    if(isset($_POST['text_box']) && $_SESSION['formFix'] == $_POST['fix']) { 
     $a = $_POST['text_box']; 
     $myFile = "textfile.txt"; 
     $fh = fopen($myFile, 'a+') or die("can't open file"); 
     fwrite($fh, $a."\r\n"); 
     fclose($fh); 
    } 
?> 
<html> 
    <body> 
     <form name="form" method="post"> 
      <input type="text" name="text_box" size="50"/> 
      <?php 
       $value = md5(rand(1,999999)); 
       $_SESSION['formFix'] = $value; 
      ?> 
      <input type="hidden" name="fix" value="<?= $value; ?>" /> 
      <input type="submit" id="search-submit" value="submit" /> 
     </form> 
    </body> 
</html> 

ps:塊的順序很重要,所以你需要反轉em。

0

正如John所說,您需要在表單提交後重定向用戶。

fclose($fh); 
// and 
header("Location: success.php or where else"); 
exit; 

注意:您重定向不會,除非ob_start工作COS你的頁面中包含HTML輸出之前不叫。

// form.php的

<?php ob_start(); ?> 
<html> 
    <body> 
     <? if (isset($_GET['success'])): ?> 
     Submit OK! <a href="form.php">New submit</a> 
     <? else: ?> 
     <form name="form" method="post" action="form.php"> 
      <input type="text" name="text_box" size="50"/> 
      <input type="submit" id="search-submit" value="submit" /> 
     </form> 
     <? endif; ?> 
    </body> 
</html> 
<?php 
    if(isset($_POST['text_box'])) { 
     $a = $_POST['text_box']; 
     $myFile = "textfile.txt"; 
     $fh = fopen($myFile, 'a+') or die("can't open file"); 
     fwrite($fh, $a."\r\n"); 
     fclose($fh); 
     // send user 
     header("Location: form.php?success=1"); 
     exit; 
    } 
?>