2017-07-09 19 views
4

私のフォームでは、ユーザーがデータベースにファイルをアップロードできるようにして、submitission_successful.php提出する "。しかし、私はそれがフォームに戻り、同じ情報がそこにあり、別の提出を許可すると、私は成功したPHPファイルの提出ボタンを押したときに気づいた。私がしたいことは、戻るボタンを押すと、コードを殺すか、ユーザーによって入力されたすべてをクリアすることです。私はキャッシュコントロールを使用しているのと同様にいくつかの答えを見つけましたが、いくつかは曖昧で、他は私のためには機能しませんでした。さらに、ユーザーが成功ページにいるときに、アップロードページに戻ることを希望しません。だから私は "ログアウト"または "ページをアップロードするに戻る"の2つのボタンを作成し、彼らが戻るボタンを押すと、それはクラッシュする理由私はConfirm Form Resubmissionページを表示したいと思います。他の投稿では、実際に「フォームの再確認の確認」を防止しようとしていますが、私はセキュリティのためにそれを持っています。ここに私のコードはページが更新されたとき、または戻るボタンがクリックされたときにフォームの再送信を防止する方法

developerUpload.php

<?php 

session_start(); 

if(array_key_exists("invalid", $_GET)){ 

    echo '<br><h3 style="color:red;">File(s) were already submitted! Please re-name file or select a different file...</h3>'; 
} 

if(isset($_COOKIE['username'])){ 

    if($_SERVER['REQUEST_METHOD'] =="POST"){ 

     $price = addslashes(trim($_POST['price'])); 
     $description = addslashes(trim($_POST['description'])); 

     if(!empty($price) && !empty($description)){ 

      $userid = $_SESSION['id']; 
      $username = $_SESSION['username']; 
      echo '<br>'.$userid; 
      $pack_id = rand(); 

      //Check file 1 
      if($_FILES['file1']['error'] !== UPLOAD_ERR_OK){ 

        $file1 = null; 
      }else{ 

       $target1 = "devFiles/"; 
       $target_file1 = addslashes(trim($target1 . basename($_FILES["file1"]["name"]))); 
       $file1 = addslashes(trim($_FILES['file1']['tmp_name'])); 

      } 

      //Check file 2 
      if($_FILES['file2']['error'] !== UPLOAD_ERR_OK){ 

        $file2 = null; 
      }else{ 

       $target2 = "devFiles/"; 
       $target_file2 = addslashes(trim($target2 . basename($_FILES["file2"]["name"]))); 
       $file2 = addslashes(trim($_FILES['file2']['tmp_name'])); 

      } 

      //Check file 3 
      if($_FILES['file3']['error'] !== UPLOAD_ERR_OK){ 

        $file3 = null; 
      }else{ 

       $target3 = "devFiles/"; 
       $target_file3 = addslashes(trim($target3 . basename($_FILES["file3"]["name"]))); 
       $file3 = addslashes(trim($_FILES['file3']['tmp_name'])); 

      } 

      //Check file 4 
      if($_FILES['file4']['error'] !== UPLOAD_ERR_OK){ 

        $file4 = null; 
      }else{ 

       $target4 = "devFiles/"; 
       $target_file4 = addslashes(trim($target4 . basename($_FILES["file4"]["name"]))); 
       $file4 = addslashes(trim($_FILES['file4']['tmp_name'])); 

      } 

      //Check file 5 
      if($_FILES['file5']['error'] !== UPLOAD_ERR_OK){ 

        $file5 = null; 
      }else{ 

       $target5 = "devFiles/"; 
       $target_file5 = addslashes(trim($target5 . basename($_FILES["file5"]["name"]))); 
       $file5 = addslashes(trim($_FILES['file5']['tmp_name'])); 

      } 

      //Check video 
      if($_FILES['video']['error'] !== UPLOAD_ERR_OK){ 

       $video = null; 
       $videoName = null; 
      }else{ 

       $target = "devFiles/"; 
       $target_file = addslashes(trim($target . basename($_FILES["video"]["name"]))); 
       $video = addslashes(trim($_FILES['video']['tmp_name'])); 
       $videoName = addslashes(trim($_FILES['video']['name'])); 

      } 

      if(file_exists($target_file1) 
       or file_exists($target_file2) 
       or file_exists($target_file3) 
       or file_exists($target_file4) 
       or file_exists($target_file5) 
       or file_exists($target_file)){ 

       header("Location: developerUpload.php?invalid"); 
       exit; 

      } 

      if(move_uploaded_file($_FILES["file1"]["tmp_name"], $target_file1) 
       && move_uploaded_file($_FILES["file2"]["tmp_name"], $target_file2) 
       && move_uploaded_file($_FILES["file3"]["tmp_name"], $target_file3) 
       && move_uploaded_file($_FILES["file4"]["tmp_name"], $target_file4) 
       && move_uploaded_file($_FILES["file5"]["tmp_name"], $target_file5) 
       && move_uploaded_file($_FILES["video"]["tmp_name"], $target_file)){ 

       try{ 

        // new php data object 
        $handler = new PDO('mysql:host=127.0.0.1;dbname=magicsever', 'root', ''); 
        //ATTR_ERRMODE set to exception 
        $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

       }catch(PDOException $e){ 
        die("There was an error connecting to the database"); 

       } 

       header("Location: submission_successful.php?"); 
       die(); 
      } 



     }else{ 

      echo '<br><h1 style="color:red;">VALUES MISSING!</h1>'; 

     } 
    } 
}else { 

    header("Location: developerLogin.php"); 
} 



?> 

submission_successful.php

<?php 
session_start(); 

    if(array_key_exists("invalid", $_GET)){ 

     header("Location: developerUpload.php?invalid"); 

    } 
    if(isset($_COOKIE['username'])){ 
     echo '<br><h1 style="color:red; text_align:center;">Thank You for Submitting!</h1>'; 

    }else{ 

     header("Location: developerLogin.php"); 
    } 

?> 
+1

あなたの最善の策はAJAXを使うことです。 PHPのヘッダ機能は必要ありません。動的divを介して成功またはエラーメッセージを表示するだけです。 – Akintunde007

+0

「フォームの再確認の確認」ページを取得するために使用するAJAXがありますか? – Jagr

+0

[フォームの再送信を防止する](https://stackoverflow.com/questions/3923904/preventing-form-resubmission) –

答えて

1

私は何日もの間何かを探していて、ついに何かを見つけました。 HTMLコマンドを使用すると、ユーザーが戻ったときにユーザーが入力したすべての入力が削除されます。ユーザーがリダイレクトされた後に戻ったときに私の問題があったため、その情報がまだあったが、あなたは

<form method="post" enctype="multipart/form-data" autocomplete="off"> 

を使用している場合、それはちょっと役立ちますので、それはすべてを削除します。ユーザーは引き続き戻ることができますが、少なくとも今はデータを再送信できません。

2

ない値が(したがって、複数の送信を防止する)データベースに二回存在するかどうかをチェックできるかどうかを確認しますが、ユーザーがフォームをあまりにも頻繁に送信しないようにすることができます。最初の投稿時に保存されたタイムスタンプを作成し、2回目の再送信のタイムスタンプが最初の投稿からあまり離れていない場合は、あまりにも頻繁に送信しているようにしてみるか、ajaxを使うか、https://es.m.wikipedia.org/wiki/Post/Redirect/Get

+0

私はあなたのところが好きですが、大きな問題は私が成功ページに送るときですそれらをアップロードページに戻したくないのです。私は2つのボタンを作成してログアウトするか、アップロードページに移動します。しかし、セッションがなければそれを達成することができないので、どこで止まっています。 – Jagr

+0

さて、戻ってこないようにすることはできません。 https:// stackoverflowという警告メッセージを追加することができます。コム/質問/ 12381563/ – Klajdi

+0

ハウツー・ストップ・ブラウザのバックボタン、JavaScriptを使用してしかし、私はあなたが戻ってフォームや申請書を提出した後に行くとき、あなたが得る – Jagr

0

この

$_SESSION["post_id"] = ""; 
if($_POST) { 
    if($_POST["post_id"] != $_SESSION["post_id"]) { 
     $_SESSION["post_id"] = $_POST["post_id"]; 
     // do database submission here 
    } 
} 

のようにセッション変数を使用しますこれは、セッション変数を設定し、彼らはフォームを再送信場合には2倍のデータを掲載しません。

+0

どこから "$ _POST ['post_id']"を取得しましたか? – Jagr

+0

'post_id'という名前の隠しフィールドを作成し、その中に乱数を生成するか、フォームを更新するたびに変更される10〜20文字の文字列を生成します。これは、提出済みかどうかを確認するチェックです。フォーム構造などがわからないため、私は答えに含めなかった – Kaboom

+0

これはコードの冒頭にあるのか、それとも提出した後になるのだろうか? – Jagr

関連する問題