पृष्ठ रीफ़्रेश होने पर फ़ॉर्म पुनः सबमिट करने से कैसे रोकें (F5 / CTRL + R)


132

मेरे पास एक सरल रूप है जो मेरी एसक्यूएल तालिका में पाठ को प्रस्तुत करता है। समस्या यह है कि उपयोगकर्ता द्वारा पाठ सबमिट करने के बाद, वे पृष्ठ को फिर से ताज़ा कर सकते हैं और डेटा फिर से फॉर्म को भरे बिना फिर से जमा हो जाता है। मैं पाठ प्रस्तुत करने के बाद उपयोगकर्ता को दूसरे पृष्ठ पर पुनः निर्देशित कर सकता था, लेकिन मैं चाहता हूं कि उपयोगकर्ता उसी पृष्ठ पर रहें।

मुझे याद है कि प्रत्येक उपयोगकर्ता को एक अनूठे सत्र आईडी देने और दूसरे मूल्य के साथ तुलना करने के बारे में कुछ पढ़ना, जो मेरे द्वारा की जा रही समस्या को हल करता है लेकिन मैं भूल गया कि यह कहाँ है।



1
आप उपयोगकर्ता को दूसरे पृष्ठ पर पुनर्निर्देशित क्यों नहीं करना चाहते हैं?
एडम

@ एडम: क्योंकि यह सर्वर के लिए एक और अनुरोध करने के लिए अतिरिक्त है जो बदले में DB से कुछ डेटा फिर से लाएगा। लेकिन यह संसाधन बर्बाद कर रहा है क्योंकि हम प्रसंस्करण POSTअनुरोध करते समय पहले से ही सभी आवश्यक डेटा प्राप्त करते हैं
यूजेन कोनकोव

PRG पैटर्न में @EugenKonkov, आप बस एक पृष्ठ पर पुनर्निर्देशित करेंगे जो एक सफलता संदेश दिखाता है। अब और डीबी की जरूरत नहीं है।
एडम

@ एडम: आप संपूर्ण रिकॉर्ड भी प्रदर्शित कर सकते हैं जो POSTआईएनजी डेटा द्वारा बनाया गया है । इस मामले में आपको SELECTडीबी से इसकी आवश्यकता है । उदाहरण के लिए, जब आप चालान बनाते हैं तो आपको /invoices/53केवल 'सफलता' के बजाय पूरे चालान को प्रदर्शित करने के लिए पुनर्निर्देशित किया जाता है
यूजेन कोनकोव

जवाबों:


96

पोस्ट / रीडायरेक्ट / पैटर्न का उपयोग करें। http://en.wikipedia.org/wiki/Post/Redirect/Get

अपनी वेबसाइट के साथ, मैं कुकी या सत्र में एक संदेश संग्रहीत करूंगा, पोस्ट के बाद पुनर्निर्देशित करूंगा, कुकी / सत्र को पढ़ूंगा, और फिर उस सत्र या कुकी चर का मान साफ़ कर दूंगा।


1
यह क्रोम को विकास के लिए अनुपयोगी बनाता है जहां व्यवसाय को केवल एक पद की आवश्यकता होती है!
जॉन पीटर्स

26
यदि आप PRG पैटर्न का उपयोग करते हैं, तो आप वास्तव में पेज को सही छोड़ते हैं? सवाल यह नहीं था कि पुनर्निर्देशन न करने पर चीजों को कैसे काम किया जाए?
एडम

1
यह मुझे लगता है कि यदि आप एक ही पृष्ठ पर पुनर्निर्देशित करते हैं, तो $ _POST साफ़ हो जाता है। जैसा कि मैंने इसे समझा, यह वांछित प्रभाव था। वैसे भी मेरा वांछित प्रभाव था। मुझे लगता है कि अगर यह स्पष्ट हो जाता है तो उत्तर बेहतर होगा।
डोनटगुए 640

ठीक है, मेरी एकमात्र सिफारिश यह सुनिश्चित करना है कि आप सख्त त्रुटि परीक्षण को सक्षम करें ताकि आप विकास करते समय स्थानीय रूप से त्रुटियों को पकड़ सकें, अन्यथा वे किसी का ध्यान नहीं जा सकते।
मौरिस

सवाल का जवाब नहीं देता। निश्चित नहीं कि यह स्वीकृत उत्तर क्यों है।
यंगगुन

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
धन्यवाद, @dbbaker, यह कमाल है :)
गुफरान हसन

1
Tks, यह मेरे लिए एकदम सही है, इसे सिर्फ 404 पेज बनाने के लिए उपयोगकर्ता की गलतफहमी से बचना था
tess hsu

एकदम कमाल का। ठनक यू
user4906240

2
यह सफारी में काम नहीं करता है, इसने href बदल दिया है लेकिन फिर भी डेटा पोस्ट सबमिट करने के अनुरोध के साथ रखें
Vo Thanh Tung

यह मेरे लिए काम करता है धन्यवाद! आप PRG दृष्टिकोण की सिफारिश क्यों करते हैं?
जसार

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!
    }

साझा करने के लिए धन्यवाद, लेकिन यह काम नहीं करता है। पृष्ठ को ताज़ा करना वास्तव में मेरे लिए फ़ॉर्म को पुनः सबमिट करता है। शायद मुझे कुछ याद आ रहा है?
अनलेर

पृष्ठ को रीफ़्रेश करने से सब कुछ फिर से सबमिट हो जाएगा, लेकिन हम केवल सबमिट किए गए डेटा को संसाधित करने के लिए चुनते हैं यदि इसकी पिछली बार भेजे गए डेटा से अलग है (जिसे हम सत्र var 'messageIdent' में संग्रहीत करते हैं)। क्या आप अपना फ़ॉर्म सबमिट कर रहे हैं 'अगर संदेश अलग हैं' खंड (यानी जहाँ 'do_your_thang ()' है)?
Moob

आपके जवाब के लिए धन्यवाद। मैंने पोस्ट / रीडायरेक्ट / गेट पैटर्न लागू करने को समाप्त कर दिया है, इसलिए, मुझे अब याद नहीं है कि वास्तव में मुझे क्या करना है। फिर से वापस चक्कर लगाने के लिए धन्यवाद।
लर्नर जू

यह तरीका रिसब्यूशन को ब्लॉक करने के लिए नहीं है ... बल्कि रीसुबिलिटेशन को डिटेक्ट करने के लिए है ताकि आप अपने कोड को बदल कर "न" कर सकें जो भी आप करेंगे तो यह एक नया सबमिशन होगा। दूसरे शब्दों में: इस पद्धति से आप "मूल" सबमिशन का पता लगा सकते हैं और अपना डेटा रख सकते हैं। यदि यह मूल नहीं है, तो अपना डेटा न रखें। या तो एक "द्वैध प्रयास" चेतावनी दिखाएं या शायद इसके बजाय एक "पुष्टि" दिखाएं।
TheSatinKnight

इस काम के लिए आपको session_start();फ़ाइल की शुरुआत में एक सत्र शुरू करना होगा । w3schools.com/php/php_session.asp का कहना है कि नोट: session_start () फ़ंक्शन आपके दस्तावेज़ में सबसे पहली चीज़ होनी चाहिए। किसी भी HTML टैग से पहले।
12

16

एक बार फॉर्म सबमिट करने के बाद मैं रीवॉर्म्शन के लिए फॉर्म को दोबारा सबमिट करने के लिए कहकर इस जावास्क्रिप्ट लाइन का इस्तेमाल करता हूं।

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

बस इस लाइन को अपनी फ़ाइल के पाद लेख पर रखें और जादू देखें


इसका एक अच्छा संस्करण होगा जो क्लाइंट की ओर से अक्षम नहीं किया जा सकता है, लेकिन यह छोटा, आसान, तेज है ... और वह करें जो करने की आवश्यकता है। इतिहास रखता है ताकि उपयोगकर्ता पोस्ट को पुनः व्यवस्थित किए बिना वापस नेविगेट कर सके।
पेतेर वेतेनी

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(); ?>" />इसके बजाय उपयोग कर सकते हैं
निकोले ब्रोंस्की

हाँ, हम माइक्रोटाइम () के साथ-साथ समय () भी रैंड () के बजाय, जो भी फ़ंक्शन या वेरिएबल अलग-अलग मूल्य देता है, उसका उपयोग कर सकते हैं। लेकिन यह सुनिश्चित करें कि आप उस मूल्य को सत्र चर के लिए निर्धारित करते हैं। यहां सत्र को रैंडचेक फ़ील्ड के साथ जांचना होगा और फिर से सबमिट करना होगा।
सावू

यदि सत्र और पोस्ट संस्करण मिलान के बाद सत्र चर को साफ़ नहीं किया जाना चाहिए?
denoise

1
@ मैं यह मानता हूं कि @Savoo द्वारा विचार यह है कि $_POSTफॉर्म डेटा के बाद एक ही पेज सत्र और पोस्ट चर को फिर से सेट करता है। यदि चर मेल खाते हैं तो जाँच के बाद भी चर का निर्माण होना चाहिए। इसलिए unsetजरूरत नहीं है।
हॉफमेन

13

जब प्रपत्र संसाधित होता है, तो आप दूसरे पृष्ठ पर पुनर्निर्देशित करते हैं:

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

आप उसी पृष्ठ पर पुनर्निर्देशित भी कर सकते हैं।

यदि आप कुछ टिप्पणियां कर रहे हैं और आप चाहते हैं कि उपयोगकर्ता उसी पृष्ठ पर बने रहें, तो आप फ़ॉर्म सबमिट करने के लिए Ajax का उपयोग कर सकते हैं


12

मुझे अगला वर्कअराउंड मिला। POSTहेरफेर करके प्रसंस्करण अनुरोध के बाद आप पुनर्निर्देशन से बच सकते हैंhistory ऑब्जेक्ट में ।

तो आपके पास HTML फॉर्म है:

<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
यह स्क्रिप्ट प्रक्रिया POSTडेटा और रेंडरिंग /the/result/pageको एक साथ प्रोसेस करती है :

  1. कोई पुनर्निर्देशन नहीं
  2. नही रेPOSTजब आप पृष्ठ (F5) को रिफ्रेश करते हैं, तो डेटा
  3. POSTजब आप ब्राउज़र इतिहास के माध्यम से पिछले / अगले पृष्ठ पर जाते हैं, तो कोई पुनः नहीं

युपीडी

एक अन्य समाधान के रूप में, मैं उपयोगकर्ताओं से हेडर सेटअप करने और बनाने के लिए काम करने की अनुमति देने के लिए मोज़िला फ़ायरफ़ॉक्स टीम से फ़ीचर अनुरोध करने के लिए कहता हूँNextPageLocationpost/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. डेटाबेस में डालने के बाद $ _POST को अनसेट करें।

    unset($_POST);


54
$ _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) की गणना की है, इसलिए यदि वे समान हैं तो हम आगे बढ़ने के लिए शांत हैं। और डीबी या ईमेल भेजने के लिए नहीं बचा है। लेकिन उपयोगकर्ता जहां भी उसे ले जाए, उसे लैंड करने दें।
फर्नांडो सिल्वा

1
मुझे लगता है कि यह पृष्ठ को फिर से लोड करने की तुलना में बेहतर समाधान है, क्योंकि मैं एक संदेश दिखाता हूं जब पोस्ट succesfull होता है और पृष्ठ को फिर से लोड करना संदेश को हटा देगा। यह मेरे लिए काम करता है, तुम भी एक uniqid का उपयोग कर सकते हैं
जूलियो पॉपकॉटल

6

यह विधि मेरे लिए अच्छी तरह से काम करती है, और मुझे लगता है कि यह काम करने के लिए सबसे सरल है।

सामान्य विचार उपयोगकर्ता को फ़ॉर्म सबमिट करने के बाद कुछ अन्य पृष्ठों पर पुनर्निर्देशित करना है, जो पेज रीफ़्रेश होने पर फ़ॉर्म को पुनः सबमिट करने से रोक देगा। फिर भी, यदि आपको फॉर्म जमा होने के बाद उपयोगकर्ता को उसी पृष्ठ पर रखने की आवश्यकता है, तो आप इसे कई तरीकों से कर सकते हैं, लेकिन यहां मैं जावास्क्रिप्ट विधि का वर्णन कर रहा हूं।

जावास्क्रिप्ट विधि

यह तरीका काफी आसान है और फॉर्म सबमिट होते ही रिफ्रेशमेंट पर फॉर्म रिब्यूशन के लिए पॉप अप को ब्लॉक कर देता है। बस अपनी फ़ाइल के पाद लेख में जावास्क्रिप्ट कोड की इस पंक्ति को रखें और जादू देखें।

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


यह मेरी मदद करता है
अंकित

4

जावास्क्रिप्ट

यह तरीका काफी आसान है और फॉर्म सबमिट होते ही रिफ्रेशमेंट पर फॉर्म रिब्यूशन के लिए पॉप अप को ब्लॉक कर देता है। बस अपनी फ़ाइल के पाद लेख में जावास्क्रिप्ट कोड की इस पंक्ति को रखें और जादू देखें।

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

3

प्रपत्र डेटा का उपयोग करने के बाद बस इसे उसी पृष्ठ पर पुनर्निर्देशित करें, और यह काम करता है। मैंने इसे आजमाया है।

header('location:yourpage.php');

4
यह सिर्फ वही जवाब दोहरा रहा है जो किसी और ने सालों पहले दिया था। (वास्तव में दो अन्य!)
निक राइस

यदि आप अन्य लोगों के उत्तरों की नकल करते हैं, तो आपको इसे दिलचस्प बनाने के लिए कम से कम अपने उत्तर में कुछ स्पष्टीकरण जोड़ना चाहिए
निको हसे

3

Moob की पोस्ट का एक परिष्कृत संस्करण। POST का हैश बनाएं, इसे सत्र कुकी के रूप में सहेजें, और हर सत्र की तुलना करें।

// 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

मूल रूप से, आपको उस पृष्ठ से पुनर्निर्देशित करने की आवश्यकता है लेकिन यह अभी भी एक समस्या बना सकता है जबकि आपका इंटरनेट धीमा (सर्वराइड से रीडायरेक्ट हेडर)

मूल परिदृश्य का उदाहरण:

दो बार सबमिट बटन पर क्लिक करें

हल करने का तरीका

  • ग्राहक की ओर

  • सर्वर साइड

    • अनुरोध भेजने पर विभेदक आधारित हैशिंग टाइमस्टैम्प / टाइमस्टैम्प का उपयोग करना।
    • सामान्य टोकन। जब मुख्य लोड अप एक अस्थायी अनुरोध tocken प्रदान करता है जिसे यदि बार-बार अनदेखा किया जाता है।

2

बिना रीडायरेक्ट के php फॉर्म रिसब्यूशन को कैसे रोकें। यदि आप $ _SESSION (session_start के बाद) और $ _POST फॉर्म का उपयोग कर रहे हैं, तो आप कुछ इस तरह कर सकते हैं:

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

अपने HTML फॉर्म में इसे डालें:

<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: यदि आप गेट फॉर्म का उपयोग कर रहे हैं, तो आप आसानी से GST के साथ सभी POST को बदल सकते हैं और यह काम भी करता है।


1

डेटाबेस में डालने के बाद, डेटा को खाली करने के लिए अनसेट () विधि को कॉल करें।

सेट नहीं ($ _ पोस्ट);

ताज़ा डेटा प्रविष्टि को रोकने के लिए, रिकॉर्ड डालने के बाद उसी पृष्ठ या विभिन्न पृष्ठ पर एक पृष्ठ पुनर्निर्देशित करें।

हैडर ( 'स्थान:' $ _ सर्वर [ 'PHP_SELF']।);


1
कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें, ताकि दूसरे इससे सीख सकें - कि unsetकॉल की आवश्यकता क्यों है ? अगर आपने इसे छोड़ दिया तो क्या होगा?
निको हसे

0

Keverw उत्तर से पोस्ट / रीडायरेक्ट / गेट पैटर्न का उपयोग करना एक अच्छा विचार है। हालाँकि, आप अपने पृष्ठ पर नहीं रह पा रहे हैं (और मुझे लगता है कि यह वही था जो आप पूछ रहे थे?) इसके अलावा, यह कभी-कभी हो सकता है :

यदि कोई वेब उपयोगकर्ता सर्वर लैग के कारण प्रारंभिक सबमिशन पूरा होने से पहले रिफ्रेश करता है, जिसके परिणामस्वरूप कुछ उपयोगकर्ता एजेंटों में डुप्लिकेट HTTP POST अनुरोध होता है।

एक अन्य विकल्प सत्र में संग्रहीत करने के लिए होगा यदि पाठ आपके SQL डेटाबेस को इस तरह लिखा जाए:

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

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

0

जैसा कि दूसरों ने कहा है, पोस्ट / रीडायरेक्ट / प्राप्त करने का उपयोग करना संभव नहीं है। लेकिन एक ही समय में यह करना काफी आसान है कि आप सर्वर साइड क्या करना चाहते हैं।

अपने POST पृष्ठ में आप केवल उपयोगकर्ता इनपुट को मान्य करते हैं, लेकिन उस पर कार्य नहीं करते हैं, इसके बजाय आप इसे एक सेशन सरणी में कॉपी करते हैं। आप फिर से मुख्य जमा पृष्ठ पर पुनः निर्देशित करते हैं। आपका मुख्य सबमिशन पेज यह देखने के लिए जाँच करके शुरू होता है कि क्या आपके द्वारा उपयोग किया जा रहा सेशन सरणी मौजूद है, और यदि ऐसा है तो इसे स्थानीय सरणी में कॉपी करें और इसे अनसेट करें। वहां से आप इस पर कार्रवाई कर सकते हैं।

इस तरह से आप केवल अपने सभी मुख्य कार्य एक बार करते हैं, जिसे आप प्राप्त करना चाहते हैं।


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"] );

यह केवल $ _POST के पुनर्निमाण से बचने के लिए काम करता है, न कि $ _GET। लेकिन यह वह व्यवहार है जिसकी मुझे आवश्यकता है। फ़ाइल अपलोड के साथ फिर से काम नहीं करता है!


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नमूना दिखाता है कि पीआरजी सही का उपयोग कैसे करें (जब फॉर्म वैध है या नहीं)।

  • यह उसी पृष्ठ पर रीडायरेक्ट करता है, जब फ़ॉर्म वैध होता है और कार्रवाई की जाती थी।
  • पुनर्निर्देशन पृष्ठ को रीफ़्रेश किए जाने से फ़ॉर्म की सुरक्षा करता है।
  • यह सत्र का उपयोग करता है सफलता के ढीले संदेशों को नहीं जो आप दिखाना चाहते हैं कि फॉर्म वैध है।
  • परीक्षण के लिए दो बटन हैं: "मान्य सबमिट", "अमान्य सबमिट"। दोनों की कोशिश करें और उसके बाद पृष्ठ ताज़ा करें।
<?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ब्राउज़र में हिट करते हैं, तो सबमिट पोस्ट चर अब सेट नहीं किया जाएगा। बस सुनिश्चित करें कि आपके सबमिट बटन में एक nameऔर idहै submit


1
En.wikipedia.org/wiki/Post/Redirect/Get पर एक नज़र डालें ! यह सही दृष्टिकोण है
15:26 पर Jan267
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.