2013-03-05 21 views
17

पर क्लिक करने पर फॉर्म पुनर्वितरण को रोकें मैंने यहां और अन्य जगहों पर कई पोस्ट की खोज की है लेकिन मेरी समस्या का समाधान नहीं लग रहा है। मेरे पास एक पृष्ठ है जो डेटाबेस प्रविष्टियों को प्रदर्शित करता है: डेटाबेस.php। इन प्रविष्टियों को एक फॉर्म के साथ फ़िल्टर किया जा सकता है। जब मैं उन्हें फ़िल्टर करता हूं और केवल उन लोगों को प्रदर्शित करता हूं जिनमें मुझे रूचि है, तो मैं एक प्रविष्टि (एक लिंक के रूप में) पर क्लिक कर सकता हूं जो मुझे उस प्रविष्टि पृष्ठ पर ले जाता है (PHP जीईटी के माध्यम से)। जब मैं उस प्रविष्टि पृष्ठ पर हूं (यानी, "view.php? Id = 1") और बैक बटन (डेटाबेस.एफपी पर वापस) दबाएं, फ़िल्टर फ़ॉर्म को फ़ॉर्म पुनर्वितरण की पुष्टि करने की आवश्यकता है। क्या इसे रोकने का कोई तरीका है?बैक बटन

database.php:

<form> 
    <select> 
     <option>1</option> 
     <option>2 
     <option> 
    </select> 
    <input type="submit" name="apply_filter" /> 
</form> 
<?php 
if (isset($_POST[ "apply_filter" ])) { // display filtered entries 
    $filter = $_POST[ "filter" ]; 
    $q = "Select * from table where col = '" . $filter . "'"; 
    $r = mysql_query($q); 
} else { // display all entries 
    $q = "Select * from table"; 
    $r = mysql_query($q); 
} 
while ($rec = mysql_fetch_assoc($r)) { 
    echo "<a href='view.php?id=" . $rec[ "id" ] . "'>" . $rec[ "name" ] . "</a><br />"; // this is where the link to the view.php page is... 
} 
?> 

अब के रूप में उल्लेख किया है, अगर मैं लिंक पर क्लिक करें, यह मेरे लेता करने के लिए "view.php

यहाँ कुछ (सरलीकृत) कोड उदाहरण हैं? आईडी = जो कुछ भी "। उस पृष्ठ पर, मैं सिर्फ आईडी यूआरएल से कि एकल प्रविष्टि प्रदर्शित करने के लिए मिलता है:

view.php:

<?php 
$id = $_GET[ "id" ]; 
$q = "Select * from table where id = '" . $id . "'"; 
$r = mysql_query($q); 
while () { 
    // display entry 
} 

?> 

अब मैं वापस बटन, database.php पर फार्म (हिट डीबी परिणामों को फ़िल्टर करने के लिए इस्तेमाल किया जाने वाला) पुनर्वितरण के लिए पुष्टि की आवश्यकता है। न केवल यह बहुत परेशान है, यह मेरे लिए भी बेकार है।

मैं इसे कैसे ठीक कर सकता हूं? मुझे उम्मीद है कि मेरी समस्या का कोड उदाहरण और स्पष्टीकरण पर्याप्त है। अगर मुझे नहीं पता है और मैं निर्दिष्ट करने की कोशिश करूंगा।

+3

** पोस्ट ** -> * serverside 302 रीडायरेक्ट * -> ** प्राप्त ** – scunliffe

+0

मुझे पता है इस विषय के साथ पदों की एक टन कर रहे हैं रहा हूँ। उनके माध्यम से ब्राउज़ करना मुझे अपनी समस्या का पता नहीं लगा सका इसलिए मैंने इसे एक नए प्रश्न के रूप में पूछने का फैसला किया। – user1889382

+0

आप शायद 'पोस्ट-रीडायरेक्ट-गेट' पैटर्न का उपयोग करना चाहते हैं, https://en.wikipedia.org/wiki/Post/Redirect/Get और http://stackoverflow.com/questions/15288229/automatically- res-post-request-in-browser-when-navigating-use-back-button –

उत्तर

9

मुझे ऐसा करने के दो तरीके हैं। सरल तरीका और कठिन तरीका।

जब भी आप किसी राज्य-आधारित पृष्ठ ($_SESSION का उपयोग कर) से निपट रहे हैं, तो आपको अपने पृष्ठों को "लाइव" रखने और अपने नियंत्रण में रखने के लिए क्या करना चाहिए, इस तरह के सभी पृष्ठों के कैशिंग को रोकना है :

<?php 
//Set no caching 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
?> 

मुश्किल तरीके से एक आईडी पैदा करने और एक छिपा इनपुट या एक &_SESSION कुकी के रूप में पृष्ठ पर इसे कहीं भंडारण शामिल है। फिर आप उसी आईडी को सर्वर पर $_SESSION के रूप में संग्रहीत करते हैं। यदि वे मेल नहीं खाते हैं, तो प्रीप्रोग्राम ifelse टाइप स्टेटमेंट्स की एक श्रृंखला का कारण बनता है क्योंकि पेज के साथ कुछ भी नहीं होता है (जिसे आप वापस क्लिक करते समय करना चाहते हैं)।

आसान तरीका बस फ़ॉर्म प्रविष्टि पृष्ठ पर वापस उपयोगकर्ता रीडायरेक्ट करने के लिए फ़ॉर्म के सफलतापूर्वक प्रस्तुत की गई थी, इसलिए की तरह है:

header('Location: http://www.mydomain.com/redirect.php'); 

मुझे आशा है कि इस मदद करता है!

+1

मुझे "आसान तरीका" नहीं समझ रहा है .. यदि उपयोगकर्ता "दृश्य" पृष्ठ पर है तो उसे रीडायरेक्ट करने का कोई तरीका नहीं है क्योंकि मुझे नहीं पता कि वह कितना समय तक जानता है उस पृष्ठ पर जानकारी देखना चाहता है। मैंने एक रीडायरेक्ट बटन शामिल किया जो उपयोगकर्ता को फॉर्म पेज पर वापस ले जाता है; यह कोई परेशानी नहीं है। केवल अगर उपयोगकर्ता पूरी डीबी पर वापस लौटने के लिए वापस दबाता है तो समस्या स्वयं प्रस्तुत करती है। – user1889382

+0

आप अपने फॉर्म से 'Database.php' पर सबमिट करेंगे, फिर सभी जानकारी एकत्र करें और उस स्क्रिप्ट के अंत में उपयोगकर्ता को अपने' हेडर 'में' $ _GET' शैली URL का उपयोग करके रीडायरेक्ट करें '(स्थान: http: // www.mydomain.com/view.php?databse=this&somethingelse=that '); ' –

3

एक चीज जो आपकी मदद कर सकती है, POST के बजाय GET विधि का उपयोग कर सकती है।

ब्राउज़र आमतौर पर POST इनपुट को स्वचालित रूप से पुनः सबमिट करने से रोकते हैं, जो कुछ ऐसा नहीं होता है जब GET इनपुट का उपयोग किया जाता है। साथ ही, यह उपयोगकर्ताओं को फ़िल्टर का उपयोग करके आपके पृष्ठ से लिंक करने देगा।

+1

यह समाधान खोज/फ़िल्टर फ़ॉर्म के लिए सबसे अच्छा है। फॉर्म रीडायरेक्ट बनाने/अपडेट करने के लिए सबसे अच्छा है। –

17

मैं जानता हूँ कि इस सवाल पुराना है, लेकिन इस मुद्दे पर अपने आप को हो रही है, दो पंक्तियों मुझे पता चला है कि काम करता है इस प्रकार हैं:

header("Cache-Control: no cache"); 
session_cache_limiter("private_no_expire"); 
+0

जहां हमें इन पंक्तियों को जोड़ना है? – user3663

+0

@ user3663 मैंने इसे सभी पृष्ठों पर उपयोग किया लेकिन केवल इंटरफ़ेस पृष्ठों पर काम कर सकता है, उदा। ओपी के सवाल के संबंध में view.php। –

-1

आप अनुरोध को हटाने की जरूरत है जो ब्राउज़र इतिहास से POST डेटा

history.replaceState("", "", "/the/result/page") 

this जवाब

इसके अलावा, आप Post/Redirect/Get पैटर्न का पालन कर सकते हैं देखें।

0

एक वैकल्पिक समाधान जो पृष्ठ को पुनः लोड होने पर भी काम करता है, उसमें $ _SESSION का उपयोग करके पोस्ट की मौलिकता की जांच करना शामिल है। संक्षेप में, एक अद्वितीय या यादृच्छिक स्ट्रिंग की जांच करें। यदि ब्लॉक एक में मान्य हैं और प्रपत्र डेटा पार्स करने के लिए

<input type="hidden" name="formToken" value="<?php echo microtime();?>"/> 

और फिर पीएचपी समारोह लपेट:

रूप में, एक मूल्य रैंड() या microtime() का उपयोग कर सेट के साथ एक इनपुट तत्व जोड़:

if(!isset($_SESSION['formToken']) || $_POST['formToken'] !== $_SESSION['formToken'])){ 
     $_SESSION['formToken'] = $_POST['formToken']; 
     /*continue form processing */ 
} 
संबंधित मुद्दे