পৃষ্ঠা সতেজ করা হলে কীভাবে ফর্ম পুনরায় জমা দেওয়া রোধ করবেন (F5 / CTRL + R)


132

আমার একটি সাধারণ ফর্ম রয়েছে যা আমার এসকিউএল টেবিলটিতে পাঠ্য জমা দেয়। সমস্যাটি হ'ল ব্যবহারকারী পাঠ্য জমা দেওয়ার পরে তারা পৃষ্ঠাটি রিফ্রেশ করতে পারে এবং ফর্মটি আবার না ভর্তি করে আবার ডেটা জমা দেওয়া হয়। পাঠ্যটি জমা দেওয়ার পরে আমি ব্যবহারকারীকে অন্য পৃষ্ঠায় পুনর্নির্দেশ করতে পারি, তবে আমি ব্যবহারকারীরা একই পৃষ্ঠায় থাকতে চাই।

আমি মনে করি প্রতিটি ব্যবহারকারীর একটি অনন্য সেশন আইডি দেওয়ার বিষয়ে এবং এটির সাথে অন্য একটি মানের সাথে তুলনা করা যা আমার সমস্যার সমাধান করেছে তবে আমি তা ভুলে গেছি।



1
আপনি কেন অন্য পৃষ্ঠায় ব্যবহারকারীকে পুনর্নির্দেশ করতে চান না?
আদম

@ অ্যাডাম: যেহেতু এটি সার্ভারের কাছে আরেকটি অনুরোধ করা অতিরিক্ত কারণ এটি আবার ডিবি থেকে কিছু তথ্য এনে দেবে। তবে এটি সম্পদ নষ্ট হচ্ছে কারণ আমরা ইতিমধ্যে POSTঅনুরোধ প্রক্রিয়াকরণের সময় প্রয়োজনীয় সমস্ত ডেটা আনি
ইউজেন কনকভ

পিআরজি প্যাটার্নে ইউজেনকনকোভ, আপনি কেবল এমন পৃষ্ঠায় পুনর্নির্দেশ করবেন যা সাফল্যের বার্তা দেখায়। ডিবি থেকে আর আনার দরকার নেই।
আদম

@ অ্যাডাম: আপনি সম্পূর্ণ রেকর্ডটি প্রদর্শন করতে পারেন যা POSTডেটা আইং দ্বারা তৈরি করা হয় । SELECTএক্ষেত্রে আপনার এটি ডিবি থেকে নেওয়া উচিত। উদাহরণস্বরূপ আপনি যখন চালানটি তৈরি করেন তখন আপনাকে পুনঃনির্দেশিত করা হয় /invoices/53যা কেবল 'সাফল্যের' পরিবর্তে পুরো চালানটি প্রদর্শন করে
ইউজেন কনকভ

উত্তর:


96

পোস্ট / পুনর্নির্দেশ / প্যাটার্ন পান প্যাটার্নটি ব্যবহার করুন। http://en.wikipedia.org/wiki/Post/Redirect/Get

আমার ওয়েবসাইটের সাথে আমি একটি কুকি বা সেশনে একটি বার্তা সঞ্চয় করব, পোস্টের পরে পুনর্নির্দেশ করব, কুকি / সেশনটি পড়বেন এবং তারপরে সেই সেশনের মান বা কুকি ভেরিয়েবলটি সাফ করুন।


1
এটি ক্রোমকে উন্নয়নের জন্য অকেজো করে তোলে যেখানে ব্যবসায়ের জন্য কেবল একটি পোস্টের প্রয়োজন হয়!
জন পিটারস

26
আপনি যদি পিআরজি প্যাটার্ন ব্যবহার করেন, তবে আপনি পৃষ্ঠাটি ঠিক ছেড়ে দেবেন? পুনর্নির্দেশ না করার সময় কীভাবে জিনিসগুলি কাজ করবেন তা প্রশ্ন ছিল না?
আদম

1
আমার কাছে মনে হচ্ছে আপনি যদি একই পৃষ্ঠাতে পুনর্নির্দেশ করেন তবে $ _POST সাফ হয়ে গেছে। আমি এটি বুঝতে হিসাবে, এটি পছন্দসই প্রভাব ছিল। এটি আমার পছন্দসই প্রভাব ছিল, যাইহোক। আমি মনে করি উত্তরটি যদি এটি স্পষ্ট করে তবে তা আরও ভাল হবে।
donutguy640

ভালভাবে কাজ করে, আমার একমাত্র সুপারিশটি হ'ল আপনি কঠোর ত্রুটি পরীক্ষাটি সক্ষম করেছেন তা নিশ্চিত করা যাতে আপনি বিকাশের সময় স্থানীয়ভাবে ত্রুটিগুলি ধরছেন, অন্যথায় তারা নজরে না যেতে পারে।
মরিস

প্রশ্নের উত্তর দেয় না। কেন এটি গৃহীত উত্তর sure
ইয়ংগুন

124

আমি এও উল্লেখ করতে চাই যে আপনি window.history.replaceStateরিফ্রেশ এবং ব্যাক বোতামে পুনরায় জমাটি আটকাতে জাভাস্ক্রিপ্ট পদ্ধতির ব্যবহার করতে পারেন ।

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

ধারণার প্রমাণ এখানে: https://dtbaker.net/files/prevent-post-resubmit.php

আমি এখনও একটি পোস্ট / পুনর্নির্দেশ / পন্থা পেতে সুপারিশ করব, তবে এটি একটি উপন্যাস জেএস সমাধান।


1
ধন্যবাদ, @dtbaker, এটা ভয়ঙ্কর :) এর
Gufran হাসান

1
টক্স, এটি আমার জন্য নিখুঁত কাজ করে, এটির জন্য কেবল ব্যবহারকারীের ভুল বোঝাবুঝি এড়ানোর জন্য 404 পৃষ্ঠা তৈরি করতে হয়েছিল
hsu

স্বাভাবিকভাবেই সুন্দর. আপনাকে ধন্যবাদ
user4906240

2
এটি সাফারিটিতে কাজ করে না, এটি বদলেছে তবে এখনও তথ্য জমা দেওয়ার অনুরোধের সাথে তথ্য রাখে
ভো থানহ তুং

এটি আমার জন্য ধন্যবাদ আপনাকে ধন্যবাদ! আপনি পিআরজি পদ্ধতির পরামর্শ দিচ্ছেন কেন?
আইজাসার

16

এটি পরিচালনা করার জন্য আপনার সত্যিকার অর্থেই কোনও পোস্ট রিডাইরেক্ট গেট প্যাটার্ন ব্যবহার করা উচিত তবে আপনি যদি কোনওভাবে এমন স্থানে পৌঁছান যেখানে পিআরজি কার্যকর হয় না (যেমন ফর্মটি নিজেই অন্তর্ভুক্ত থাকে, পুনর্নির্দেশগুলি রোধ করে) আপনি অনুরোধের কয়েকটি পরামিতি হ্যাশ করতে পারেন সামগ্রীর উপর ভিত্তি করে একটি স্ট্রিং তৈরি করতে এবং তারপরে আপনি এটি ইতিমধ্যে প্রেরণ করেননি তা পরীক্ষা করে দেখুন।

//create digest of the form submission:

    $messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);

//and check it against the stored value:

    $sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';

    if($messageIdent!=$sessionMessageIdent){//if its different:          
        //save the session var:
            $_SESSION['messageIdent'] = $messageIdent;
        //and...
            do_your_thang();
    } else {
        //you've sent this already!
    }

ভাগ করে নেওয়ার জন্য ধন্যবাদ তবে এটি কার্যকর হবে বলে মনে হচ্ছে না। পৃষ্ঠাটি রিফ্রেশ করা সত্যই আমার পক্ষে ফর্মটি পুনরায় জমা দেয়। সম্ভবত আমি কিছু মিস করছি?
জুনিয়র

পৃষ্ঠাটি রিফ্রেশ করা সমস্ত কিছু পুনরায় জমা দেবে তবে আমরা কেবলমাত্র জমা দেওয়ার ডেটাটি শেষ সময় প্রেরণ করা ডেটার চেয়ে আলাদা (যা আমরা সেশনের ভার 'ম্যাসেজআইডেন্ট' এ সংরক্ষণ করি) প্রক্রিয়াকরণ করার জন্য বেছে নিই। আপনি যদি 'যদি ম্যাসেজআইডেন্টস আলাদা হয়' ক্লজটির মধ্যে আপনার ফর্ম জমা দেওয়ার প্রক্রিয়া করছেন (অর্থাত্ 'do_your_tang ()' কোথায়)?
মূব

আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. আমি কেবল পোস্ট / পুনর্নির্দেশ / প্যাটার্নটি প্যাটার্ন বাস্তবায়ন করে শেষ করেছি, সুতরাং, আমাকে ঠিক কী ট্রিপ করছিল তা এখন আমার মনে নেই। আবার চক্কর দেওয়ার জন্য আবার ধন্যবাদ।
aLearner

এই পদ্ধতিটি পুনরায় জমাকরণ অবরুদ্ধ করার জন্য নয় ... তবে পুনরায় জমা দেওয়ার শনাক্তকরণ যাতে আপনি নিজের কোডটি "না" করতে পরিবর্তন করতে পারেন তবে আপনি যদি যা করেন তবে তা যদি নতুন করে জমা দেওয়া হয়। অন্য কথায়: এই পদ্ধতির সাহায্যে আপনি "মূল" জমাটি সনাক্ত করতে পারেন এবং আপনার ডেটা স্থাপন করতে পারেন। যদি এটি আসল না হয় তবে আপনার ডেটা রাখবেন না। হয় "ডুপ চেষ্টা" সতর্কতা দেখান বা তার পরিবর্তে সম্ভবত "নিশ্চিতকরণ" দেখান।
TheSatinKnight

এটি কাজ করার জন্য আপনার অবশ্যই session_start();ফাইলটির শুরুতে যোগ করে একটি সেশন শুরু করতে হবে । w3schools.com/php/php_sessions.asp বলে নোট: সেশন_স্টার্ট () ফাংশনটি অবশ্যই আপনার নথিতে প্রথম জিনিস হতে হবে। কোনও HTML ট্যাগের আগে।
উইকিল

16

আমি এই জাভাস্ক্রিপ্ট লাইনটি ফর্ম জমা দেওয়ার পরে রিফ্রেশে ফর্ম পুনরায় জমা দেওয়ার জন্য জিজ্ঞাসা করে পপ আপ ব্লক করতে ব্যবহার করি use

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

আপনার ফাইলের ফুটারে এই লাইনটি রাখুন এবং যাদুটি দেখুন


এটির একটি দুর্দান্ত সংস্করণ হবে যা ক্লায়েন্টের পক্ষ থেকে অক্ষম করা যায় না, তবে এটি সংক্ষিপ্ত, সহজ, দ্রুত ... এবং যা করার দরকার তা করুন do ইতিহাসটি রাখে যাতে ব্যবহারকারী পোস্ট পুনরায় বিক্রয় না করেই আবার নেভিগেট করতে পারে।
পিয়েটার ভার্টিনিয়

16

আপনি একটি সেশন ভেরিয়েবলের মাধ্যমে ফর্ম পুনরায় জমা দিতে বাধা দিতে পারেন।

প্রথমে আপনাকে rand()একটি পাঠ্যবক্সে এবং $_SESSION['rand']ফর্ম পৃষ্ঠায় সেট করতে হবে :

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

এর পরে $_SESSION['rand']পাঠ্যবাক্সের $_POST['randcheck']মানটির সাথে এটি পরীক্ষা করুন :

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

3
আমরা <input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />পরিবর্তে ব্যবহার করতে পারি
নিকোলে ব্রোনস্কি

হ্যাঁ আমরা মাইক্রোটাইম () পাশাপাশি সময় () এছাড়াও র‌্যান্ড () এর পরিবর্তে ব্যবহার করতে পারি, যাইহোক ফাংশন বা ভেরিয়েবল যা বিভিন্ন মান দেয় যা আমরা এটি ব্যবহার করতে পারি। তবে নিশ্চিত হয়ে নিন যে আপনি সেই মানটি SESSION ভেরিয়েবলে সেট করেছেন। এখানে স্যান্ডশন অবশ্যই র্যান্ডচেক ফিল্ডের সাথে চেক করা এবং পুনরায় জমা ফর্ম থেকে রোধ করতে হবে।
সাভু

সেশন এবং পোস্ট ওয়ার্স মিলছে কিনা তা যাচাই করার পরে সেশন ভেরিয়েবলটি সাফ করা উচিত নয়?
denoise

1
@ এডনয়েস আমি বিশ্বাস করি @ সাভোর ধারণাটি হ'ল $_POSTফর্ম ডেটার পরে একই পৃষ্ঠাটি সেশন এবং পোস্ট ভেরিয়েবলগুলি পুনরায় সেট করে। ভেরিয়েবলগুলি মিলছে কিনা তা যাচাই করার পরে ভেরিয়েবলের তৈরি হওয়া উচিত। অতএব unsetপ্রয়োজন হয় না।
হাফমেনস

13

ফর্মটি প্রক্রিয়া করা হয়, আপনি অন্য পৃষ্ঠায় পুনঃনির্দেশ:

... process complete....
header('Location: thankyou.php');

আপনি একই পৃষ্ঠায় পুনর্নির্দেশ করতে পারেন।

আপনি যদি মতামতের মতো কিছু করছেন এবং আপনি ব্যবহারকারী একই পৃষ্ঠায় থাকতে চান তবে আপনি ফর্ম জমা দেওয়ার জন্য এজাক্স ব্যবহার করতে পারেন


12

আমি পরবর্তী কাজ খুঁজে পেয়েছি। আপনি পুনর্নির্দেশটি অবজেক্টটি POSTম্যানিপুলেট করে অনুরোধ প্রক্রিয়া করার পরে এড়াতে পারেন history

সুতরাং আপনার এইচটিএমএল ফর্ম রয়েছে:

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

আপনি যখন এই সার্ভারে এই ফর্মটি প্রক্রিয়া করেন তখন আপনি এই /the/result/pageজাতীয় Locationশিরোনাম সেট করে ব্যবহারকারীকে পুনর্নির্দেশের পরিবর্তে :

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

এখানে চিত্র বর্ণনা লিখুন

POSTএড ডেটা প্রক্রিয়াকরণের পরে আপনি ছোট <script>এবং ফলাফলটি সরবরাহ করেন/the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

<script>আপনি রেন্ডার করা উচিত:

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

ফলাফল হলো:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পারেন যে ফর্ম ডেটা স্ক্রিপ্ট POSTএড হয় process.php
এই স্ক্রিপ্টটি প্রক্রিয়া POSTed ডেটা এবং রেন্ডারিং /the/result/pageএকবারে সঙ্গে

  1. কোনও পুনঃনির্দেশ
  2. POSTআপনি পৃষ্ঠা রিফ্রেশ করার সময় কোনও পুনরায় ডেটা নেই (F5)
  3. POSTযখন আপনি ব্রাউজারের ইতিহাসের মাধ্যমে পূর্ববর্তী / পরবর্তী পৃষ্ঠায় নেভিগেট করেন তখন পুনরায় নেই

UPD

অন্য সমাধান হিসাবে আমি জিজ্ঞাসা বৈশিষ্ট্য অনুরোধ মোজিলা ফায়ারফক্স সেটআপ করার জন্য ব্যবহারকারীদের অনুমতি দল NextPageহেডার যা মত কাজ করবেLocation হেডার এবং করতে post/redirect/getপ্যাটার্ন অপ্রচলিত।

সংক্ষেপে. সার্ভার প্রক্রিয়া POSTতথ্য সাফল্যের সাথে এটি ফর্ম যখন :

  1. এর NextPageপরিবর্তে শিরোনাম সেটআপ করুনLocation
  2. প্রক্রিয়াকরণ ফল রেন্ডার POSTফর্ম তথ্য যেমন জন্য রেন্ডার হবে GETঅনুরোধ post/redirect/getপ্যাটার্ন

ব্রাউজারটি যখন NextPageশিরোনামটি দেখবে :

  1. সামঞ্জস্যবিধান window.locationসঙ্গেNextPageমান
  2. ব্যবহারকারী পৃষ্ঠাটি রিফ্রেশ করার সময় ব্রাউজারটি পুনরায় ডেটা ফর্মের পরিবর্তে GETঅনুরোধটি আলোচনা করবেNextPagePOST

আমি মনে করি এটি বাস্তবায়িত হলে দুর্দান্ত হবে, না? =)


11
  1. শিরোনাম ব্যবহার করুন এবং পৃষ্ঠাটি পুনর্নির্দেশ করুন।

    header("Location:your_page.php"); আপনি একই পৃষ্ঠা বা বিভিন্ন পৃষ্ঠায় পুনঃনির্দেশ করতে পারেন।

  2. এটি ডেটাবেসে afterোকানোর পরে Un _POST আনসেট করুন।

    unset($_POST);


54
Set _POST আনসেট করা ফর্ম পুনরায় জমা দেওয়ার ক্ষেত্রে মোটেই প্রভাব ফেলবে না, কমপক্ষে Chrome এ নয়।
গাভিন

2
এটি কাজ করবে না. ব্যবহারকারী যখন পৃষ্ঠার পিছনে যান এটি আবার POST ভেরিয়েবলগুলি সেট আপ করে।
সন্ধু

ব্যবহারের কারণ কী unset? দয়া করে আপনার উত্তরে কিছু ব্যাখ্যা যুক্ত করুন যাতে অন্যরা এটি থেকে শিখতে পারে
নিকো হাজে

7

একটি দুর্দান্ত নিশ্চিত উপায় হ'ল পোস্টটিতে একটি অনন্য আইডি প্রয়োগ করা এবং এটিতে ক্যাশে করা

<input type='hidden' name='post_id' value='".createPassword(64)."'>

তারপরে আপনার কোডে এটি করুন:

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

আমি আসলে এটির মতোই কিছু লিখেছি, তবে পাসওয়ার্ড তৈরি করতে সমস্যাটি কাটেনি, আমি কেবল আমার ফর্মগুলি গণনা করেছি (উদাহরণস্বরূপ: 1-5 পদক্ষেপ), তাই যদি তারা সমান হয় তবে আমরা এগিয়ে যেতে শীতল, অন্যথায় ডিবি বা ইমেল প্রেরণে সংরক্ষণ করবেন না। তবে ব্যবহারকারী যেখানেই তাকে যেখানেই নেমে আসে let
ফার্নান্দো সিলভা

1
আমি মনে করি পৃষ্ঠাটি পুনরায় লোড করার চেয়ে এটি আরও ভাল সমাধান, যেহেতু পোস্ট সাফল্যপূর্ণ হওয়ার সময় আমি কোনও বার্তা দেখি এবং পৃষ্ঠাটি পুনরায় লোড করা বার্তাটি মুছে ফেলবে। এটি আমার জন্য কৃতজ্ঞতা প্রকাশ করে, আপনি একটি ইউনিকিডও ব্যবহার করতে পারেন
জুলিও পপক্যাটল

6

এই পদ্ধতিটি আমার পক্ষে ভালভাবে কাজ করে এবং আমি মনে করি যে এই কাজটি করা সবচেয়ে সহজ।

সাধারণ ধারণাটি হ'ল ফর্ম জমা দেওয়ার পরে ব্যবহারকারীকে অন্য কয়েকটি পৃষ্ঠায় পুনর্নির্দেশ করা, যা পৃষ্ঠা রিফ্রেশে ফর্ম পুনরায় জমা দেওয়া বন্ধ করে দেয়। তবুও, ফর্মটি জমা দেওয়ার পরে আপনার যদি একই পৃষ্ঠাতে ব্যবহারকারীকে ধরে রাখা দরকার হয় তবে আপনি এটি একাধিক উপায়ে করতে পারেন, তবে এখানে আমি জাভাস্ক্রিপ্ট পদ্ধতিটি বর্ণনা করছি।

জাভাস্ক্রিপ্ট পদ্ধতি

এই পদ্ধতিটি বেশ সহজ এবং একবার ফর্ম জমা দেওয়ার পরে রিফ্রেশে ফর্ম পুনরায় জমা দেওয়ার জন্য পপ আপকে ব্লক করে blocks জাভাস্ক্রিপ্ট কোডের এই লাইনটি কেবল আপনার ফাইলের ফুটারে রাখুন এবং যাদুটি দেখুন।

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>


এটি আমাকে পাশাপাশি সহায়তা করে
অঙ্কিত

4

জাভাস্ক্রিপ্ট

এই পদ্ধতিটি বেশ সহজ এবং একবার ফর্ম জমা দেওয়ার পরে রিফ্রেশে ফর্ম পুনরায় জমা দেওয়ার জন্য পপ আপকে ব্লক করে blocks জাভাস্ক্রিপ্ট কোডের এই লাইনটি কেবল আপনার ফাইলের ফুটারে রাখুন এবং যাদুটি দেখুন।

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

3

ফর্ম ডেটা ব্যবহার করার পরে এটি একই পৃষ্ঠায় পুনর্নির্দেশ করুন এবং এটি কার্যকর হয়। আমি চেষ্টা করেছি।

header('location:yourpage.php');

4
এটি কেবল একই উত্তরটির পুনরাবৃত্তি করছে যা বছর কয়েক আগে অন্য কেউ দিয়েছিল। (প্রকৃতপক্ষে আরও দু'জন!)
নিক রাইস

আপনি যদি অন্য লোকের উত্তরগুলির সদৃশ হন তবে আপনার উত্তরটি আকর্ষণীয় করে তুলতে আপনার কমপক্ষে কিছু ব্যাখ্যা যুক্ত করা উচিত
নিকো হাজে

3

মুবের পোস্টের একটি পরিশ্রুত সংস্করণ। পোষ্টের একটি হ্যাশ তৈরি করুন, এটি একটি সেশন কুকি হিসাবে সংরক্ষণ করুন এবং প্রতিটি সেশনে হ্যাশগুলির তুলনা করুন।

// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );

$post_hash = md5( json_encode( $_POST ) );

if( session_start() )
{
    $post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
    $_SESSION[ 'post_hash' ] = $post_hash;
    session_write_close();
}
else
{
    $post_resubmitted = false;
}

if ( $post_resubmitted ) {
  // POST was resubmitted
}
else
{
  // POST was submitted normally
}

2

মূলত, আপনাকে সেই পৃষ্ঠাটি থেকে পুনঃনির্দেশ করা দরকার তবে এটি আপনার ইন্টারনেট ধীর হয়ে যাওয়ার পরেও সমস্যা তৈরি করতে পারে (সার্ভারসাইড থেকে শিরোনাম পুনর্নির্দেশ)

প্রাথমিক দৃশ্যের উদাহরণ:

সাবমিট বাটনে দুবার ক্লিক করুন

সমাধানের উপায়

  • মক্কেলের পক্ষে

  • সার্ভার সাইড

    • অনুরোধ প্রেরিত হওয়ার সময় ডিফারেন্টেট বেসড হ্যাশিং টাইমস্ট্যাম্প / টাইমস্ট্যাম্প ব্যবহার করে।
    • Userequest টোকেন। প্রধান লোড আপ যখন একটি অস্থায়ী অনুরোধ টোকেন দেয় যা পুনরাবৃত্তি যদি উপেক্ষা করা হয়।

2

পুনর্নির্দেশ ছাড়াই পিএইচপি ফর্ম পুনরায় জমা দেওয়া কীভাবে রোধ করবেন। আপনি যদি $ _SESSION (সেশন_স্টার্টের পরে) এবং একটি $ _POST ফর্ম ব্যবহার করে থাকেন তবে আপনি এরকম কিছু করতে পারেন:

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

আপনার এইচটিএমএল ফর্ম এ এটি লিখুন:

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

সুতরাং, প্রতিটি বার যখন ফর্মটি জমা দেওয়া হয় তখন একটি নতুন আইন উত্পন্ন হয়, সেশনে সংরক্ষণ করা হয় এবং পোস্ট অ্যাক্টের সাথে তুলনা করা হয়।

PS: আপনি যদি একটি get form ব্যবহার করেন তবে আপনি সহজেই GET এর সাথে সমস্ত পোস্ট পরিবর্তন করতে পারেন এবং এটিও কার্যকর হয়।


1

এটি ডাটাবেসে serোকানোর পরে, ডেটা সাফ করার জন্য আনসেট () পদ্ধতিতে কল করুন।

সেট না ($: _ পোষ্ট);

রিফ্রেশ ডেটা সন্নিবেশ রোধ করতে, রেকর্ড সন্নিবেশের পরে একই পৃষ্ঠায় বা ভিন্ন পৃষ্ঠায় কোনও পৃষ্ঠা পুনর্নির্দেশ করুন।

হেডার ( 'অবস্থান:' $: _ সার্ভার [ 'PHP_SELF']।);


1
দয়া করে আপনার উত্তরে কিছু ব্যাখ্যা যুক্ত করুন যাতে অন্যরা এটি শিখতে পারে - কেন এই unsetকলটির প্রয়োজন? এড়িয়ে গেলে কী হবে?
নিকো হেসে

0

কেভারউ উত্তর থেকে পোস্ট / পুনঃনির্দেশ / পান প্যাটার্ন ব্যবহার করা ভাল ধারণা। তবে আপনি নিজের পৃষ্ঠায় থাকতে পারবেন না (এবং আমি মনে করি এটিই আপনি যা চেয়েছিলেন?) তদাতিরিক্ত এটি ব্যর্থ হতে পারে :

কোনও ওয়েব ব্যবহারকারী যদি সার্ভার ল্যাগের কারণে প্রাথমিক জমা দেওয়ার আগে সতেজ হয় তবে নির্দিষ্ট ব্যবহারকারী এজেন্টগুলির মধ্যে একটি সদৃশ HTTP পোষ্ট অনুরোধের ফলস্বরূপ।

আপনার বিকল্পটি যদি আপনার এসকিউএল ডাটাবেজে এইভাবে লেখা থাকে তবে একটি অধিবেশন সঞ্চয় করতে হবে:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

0

অন্যরা যেমন বলেছে, পোস্ট / পুনঃনির্দেশ / পাওয়া ব্যবহার করা সম্ভব নয়। তবে একই সাথে আপনি সার্ভার সাইডটি যা করতে চান তা করা বেশ সহজ।

আপনার পোস্ট পৃষ্ঠায় আপনি কেবল ব্যবহারকারী ইনপুটকে বৈধতা দিয়েছিলেন তবে এতে কোনও পদক্ষেপ করবেন না, পরিবর্তে আপনি এটি সেশন অ্যারেতে অনুলিপি করছেন। তারপরে আপনি আবার মূল জমা পৃষ্ঠাতে পুনর্নির্দেশ করুন। আপনার প্রধান জমা দেওয়ার পৃষ্ঠাটি আপনি ব্যবহার করছেন এমন সেশন অ্যারে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে শুরু হয় এবং যদি তাই হয় তবে এটি একটি স্থানীয় অ্যারেতে অনুলিপি করে সেটটি সেট না করে। সেখান থেকে আপনি এটিতে অভিনয় করতে পারেন।

আপনি যা করতে চান তা অর্জন করে আপনি কেবল একবার আপনার সমস্ত মূল কাজ একবারে করেন।


0

এরপরে একটি বিশাল প্রকল্পে পুনরায় জমা দেওয়া রোধ করতে আমি সমাধানের সন্ধান করেছি। কোডটি $ _GET এবং $ _POST নিয়ে অত্যন্ত কাজ করে এবং আমি অপ্রত্যাশিত বাগের ঝুঁকি ছাড়াই ফর্ম উপাদানগুলির আচরণটি পরিবর্তন করতে পারি না। সুতরাং, এখানে আমার কোড:

<!-- language: lang-php -->
<?php

// Very top of your code:

// Start session:
session_start();

// If Post Form Data send and no File Upload
if ( empty( $_FILES ) && ! empty( $_POST ) ) {
    // Store Post Form Data in Session Variable
    $_SESSION["POST"] = $_POST;
    // Reload Page if there were no outputs
    if ( ! headers_sent() ) {
        // Build URL to reload with GET Parameters
        // Change https to http if your site has no ssl
        $location = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        // Reload Page
        header( "location: " . $location, true, 303 );
        // Stop any further progress
        die();
    }
}

// Rebuilt POST Form Data from Session Variable
if ( isset( $_SESSION["POST"] ) ) {
    $_POST = $_SESSION["POST"];
    // Tell PHP that POST is sent
    $_SERVER['REQUEST_METHOD'] = 'POST';
}

// Your code:
?><html>
    <head>
        <title>GET/POST Resubmit</title>
    </head>
    <body>

    <h1>Forms:</h1>
    <h2>GET Form:</h2>
    <form action="index.php" method="get">
        <input type="text" id="text_get" value="test text get" name="text_get"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form:</h2>
    <form action="index.php" method="post">
        <input type="text" id="text_post" value="test text post" name="text_post"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form with GET action:</h2>
    <form action="index.php?text_get2=getwithpost" method="post">
        <input type="text" id="text_post2" value="test text get post" name="text_post2"/>
        <input type="submit" value="submit">
    </form>
    <h2>File Upload Form:</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file">
        <input type="submit" value="submit">
    </form>

    <h1>Results:</h1>
    <h2>GET Form Result:</h2>
    <p>text_get: <?php echo $_GET["text_get"]; ?></p>
    <h2>POST Form Result:</h2>
    <p>text_post: <?php echo $_POST["text_post"]; ?></p>
    <h2>POST Form with GET Result:</h2>
    <p>text_get2: <?php echo $_GET["text_get2"]; ?></p>
    <p>text_post2: <?php echo $_POST["text_post2"]; ?></p>
    <h2>File Upload:</h2>
    <p>file:
    <pre><?php if ( ! empty( $_FILES ) ) {
            echo print_r( $_FILES, true );
        } ?></pre>
    </p>
    <p></p>
    </body>
    </html><?php
// Very Bottom of your code:
// Kill Post Form Data Session Variable, so User can reload the Page without sending post data twice
unset( $_SESSION["POST"] );

এটি কেবল $ _GET নয়, $ _POST এর পুনরায় জমা এড়াতে কাজ করে। তবে এটি আমার প্রয়োজন আচরণ। পুনরায় জমা দেওয়ার সমস্যা ফাইল আপলোডগুলির সাথে কাজ করে না!


0

আমার জন্য কি কাজ করে:

if ( !refreshed()) {
   //Your Submit Here
        if (isset( $_GET['refresh'])) {
            setcookie("refresh",$_GET['refresh'], time() + (86400 * 5), "/");
        }

    }    
}


function refreshed()
{
    if (isset($_GET['refresh'])) {
        $token = $_GET['refresh'];
        if (isset($_COOKIE['refresh'])) {
            if ($_COOKIE['refresh'] != $token) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}  


function createToken($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

?>

এবং আপনার ফর্ম মধ্যে

 <form  action="?refresh=<?php echo createToken(3)?>">



 </form>

0

এই form.phpনমুনাটি দেখায় যে কীভাবে পিআরজি সঠিকভাবে ব্যবহার করতে হয় (যখন ফর্মটি বৈধ হয় বা না)।

  • এটি একই পৃষ্ঠায় পুনঃনির্দেশ করে, কেবল যখন ফর্মটি বৈধ হয় এবং ক্রিয়া সম্পাদিত হয়।
  • পুনঃনির্দেশ ফর্মটি পুনরায় রিফ্রেশে পুনরায় জমা করা থেকে রক্ষা করে।
  • এটি ফর্মটি বৈধ হওয়ার পরে আপনি যে সাফল্যের বার্তাটি প্রদর্শন করতে চান তা notিলে করতে সেশন ব্যবহার করে।
  • পরীক্ষার জন্য দুটি বোতাম রয়েছে: "বৈধ জমা দিন", "অবৈধ জমা দিন"। উভয় চেষ্টা করুন এবং তার পরে পৃষ্ঠা রিফ্রেশ করুন।
<?php
session_start();

function doSelfRedirect()
{
  header('Location:'.$_SERVER['PHP_SELF']);
  exit;
}

function setFlashMessage($msg)
{
  $_SESSION['message'] = $msg;
}

function getFlashMessage()
{
  if (!empty($_SESSION['message'])) {
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
  } else {
    $msg = null;
  }

  return $msg;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Validation primitive example.
  if (empty($_POST['valid'])) {
    $formIsValid = false;
    setFlashMessage('Invalid form submit');
  } else {
    $formIsValid = true;
  }

  if ($formIsValid) {
    // Perform any actions here.
    // ...

    // Cool!
    setFlashMessage('Form is valid. Action performed.');

    // Prevent form resubmission.
    doSelfRedirect();
  }
}
?>
<h1>Hello form</h1>

<?php if ($msg = getFlashMessage()): ?>
  <div><?= $msg ?></div>
<?php endif; ?>

<form method="post">
  <input type="text" name="foo" value="bar"><br><br>
  <button type="submit" name="invalid" value="0">Invalid submit</button>
  <button type="submit" name="valid" value="1">Valid submit</button>
</form>

-2
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}

দয়া করে আপনার উত্তরে কিছু ব্যাখ্যা যুক্ত করুন যাতে অন্যরা এটি থেকে শিখতে পারে - $everything_fineকোথা থেকে এসেছে?
নিকো হেসে

-3

$_POST['submit']ফর্মটিতে যা আছে তা সংরক্ষণ করার জন্য কেন কেবল ভেরিয়েবলটিকে যৌক্তিক বিবৃতি হিসাবে ব্যবহার করবেন না । আপনি সর্বদা একই পৃষ্ঠায় পুনর্নির্দেশ করতে পারেন (যদি তারা রিফ্রেশ হয়, এবং তারা go backব্রাউজারে আঘাত করলে , পোস্টের পোস্টের ভেরিয়েবলটি আর সেট করা যায় না Just কেবল নিশ্চিত করুন যে আপনার জমা বোতামটি একটি nameএবং idআছে submit


1
En.wikedia.org/wiki/Post/Redirect/Get এ একবার দেখুন ! এটি সঠিক পদ্ধতির
jan267
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.