2013-10-07 9 views
10

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

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

क्या इसे ठीक करने का कोई तरीका है, इसलिए मेरे ग्राहक केवल बैक बटन का उपयोग करने में सक्षम होंगे जैसा कि उन्हें करना था।

This webpage requires data that you entered earlier in order to be properly displayed. You can send this data again, but by doing so you will repeat any action this page previously performed. Reload this webpage. Press the reload button to resubmit the data needed to load the page. Error code: ERR_CACHE_MISS

+2

आप एक सर्वर का उपयोग करने के लिए खुले हैं अंत डेटा भंडारण? MySQL, Redis? सर्वर पर डेटा को स्टोर करने का सबसे अच्छा तरीका है क्योंकि उपयोगकर्ता आसपास घूमता है। –

+0

और इसके द्वारा आप का मतलब है कि मुझे उपयोगकर्ता के सत्र के दौरान सबमिट किए गए फॉर्मों से सभी मूल्यों को स्टोर करने की आवश्यकता है? क्या मैं इसके लिए सत्र भंडारण का उपयोग कर सकता हूं? –

+0

आप सत्र भंडारण का उपयोग कर सकते हैं, लेकिन यह बहुत स्केल-सक्षम नहीं है और यह जाने का गलत तरीका बन जाता है कि डेटा की मात्रा थोड़ा सा से थोड़ा अधिक हो जाती है या नहीं। मैं कहूंगा कि होमवर्क सत्र भंडारण ठीक है, उत्पादन के लिए यह पर्याप्त नहीं है। –

उत्तर

0
<?php 
if(isset($_POST['submit'])) 
{ 
//submission goes here 
} 
?> 

इस तुम क्या सोच रहे थे:

यहाँ पूरा टेक्स्ट कि ब्राउज़र मुझे प्रदान करता है?

संपादित करें - एसक्यूएल वास्तव में काम करने के लिए एक सुंदर चीज़ है, मुझे लगता है कि इसे एक टिप्पणी में एक सिफारिश के रूप में जोड़ा गया है, और यदि आप कर सकते हैं, तो मैं एसक्यूएल का उपयोग करना चाहता हूं, यह तेज़, सहज और कुशल है।

+2

कोई भी छोटा नहीं – ElefantPhace

8

** कुछ पृष्ठभूमि: क्रेडिट उत्कृष्ट उत्कृष्टता के लिए ब्रूस (sqlwork.com) पर जाता है।

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

वेब डेवलपर्स के मैला कोडिंग प्रथाओं के कारण ब्राउज़र को इस संदेश को जोड़ने के लिए मजबूर होना पड़ा।

1) उपयोगकर्ता प्रपत्र में भर जाता है और (पदों फार्म) 2) सर्वर प्रक्रिया के बाद डेटा सबमिट करता है और) एक नया पृष्ठ (पुष्टि के साथ प्रतिक्रिया के रूप में चिह्नित नहीं संचित करने योग्य 3) उपयोगकर्ता नेविगेट करता है: परिदृश्य इस प्रकार है एक नए पेज पर। 4) उपयोगकर्ता वापस दबाएं:

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

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

नोट: वेबफॉर्म का पोस्टबैक मॉडल स्वयं को इस समस्या के लिए उधार देता है। सर्वर स्थानान्तरण से भी बचें।

मेरे समाधान

$ _SESSION [ 'घर'] मुख पृष्ठ पर किसी भी त्रुटि के स्टोर करने के लिए इस्तेमाल किया।

$ _SESSION ['tempEmail'] php रूप पर मूल्य गूंजने के लिए उपयोग किया जाता है।

नोट: प्रत्येक पृष्ठ के लिए एक अद्वितीय सत्र चर का उपयोग करें जिसमें त्रुटि प्रबंधन के लिए HTML फॉर्म है और HTML फॉर्म पर प्रतिबिंबित प्रत्येक मान के लिए कोई सत्र चर भी है।

<?php 
session_start(); 

//Initialize variables not initialized without overwriting previously set variables. 
if(!isset($_SESSION['home'])) { 
$_SESSION['home']=""; 
$_SESSION['tempEmail']=""; 
} 

वैकल्पिक - अगर प्रवेश किया था, (यदि नहीं पहले किया) $ _SESSION [ 'tempEmail'] चर करने के लिए ईमेल पता असाइन HTML प्रपत्र पूर्व भरने के लिए।

if(isset($_POST['Submit'])){ 

---your code--- 


    //Error message(s) examples 
    $_SESSION['home'] = "Email and Password do not match, please try again."; 
    header("Location: " . $_SERVER['REQUEST_URI']); 

    $_SESSION['home'] = "Email address format is invalid. Please recheck."; 
    header("Location: " . $_SERVER['REQUEST_URI']); 

    //success 
    unset ($_SESSION['home']); //optional, unset to clear form values. 
    header ("location: nextpage.php"); 
      ---or--- 
    header("Location: " . $_SERVER['REQUEST_URI']); //re-post to same page with the $_SESSION['home'] success message. 
} 
?> 



<body> 

त्रुटि बॉक्स

<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span> 

HTML प्रपत्र

<form action="#" name="loginform" method="post" > 
    <input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/> 
    <input type="submit" name="Submit" value="Submit"> 
</form> 

</body> 

, भुगतान पृष्ठ पर उपयोग उपरोक्त चर्चा देखने के लिए अनुशंसित नहीं है। फ़ायरफ़ॉक्स, क्रोम, सफारी, और आईई 9 में परीक्षण किया गया। बैक बटन का उपयोग करते समय कष्टप्रद संदेश चले गए हैं। हेडर चेतावनियों से बचने के लिए सुनिश्चित करें कि आउटपुट बफरिंग आपके php स्क्रिप्ट या php.ini में "चालू" हो गई है। आप निम्न के लिए अपनी php.ini फ़ाइल देख सकते हैं;

output_buffering=On 
18

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

हालांकि, PHP कोडर स्क्रिप्ट में थोड़ा कोड जोड़कर ब्राउज़र से कष्टप्रद संदेश के आसपास काम कर सकता है। उदाहरण कोड की कुछ पंक्तियों को दिखाता है जिन्हें किसी भी hangup के बिना पोस्ट करते समय पृष्ठ पर आगे और आगे जाने में सक्षम होने के लिए session_start() से ऊपर जोड़ा जा सकता है। 'Private_no_expire' मोड का अर्थ है कि क्लाइंट को प्राप्त नहीं होगा पहली जगह में समाप्त हो गया हैडर।

header('Cache-Control: no cache'); //no cache 
session_cache_limiter('private_no_expire'); // works 
//session_cache_limiter('public'); // works too 
session_start(); 
2

मैंने इस उत्तर की कोशिश की और यह ठीक है। session_start():

session_cache_limiter('private, must-revalidate'); 
session_cache_expire(60); 

गुड लक

4

मैंने पाया कि बस का उपयोग कर: आप पहले इस कोड रखना होगा

header('Cache-Control: no cache'); //disable validation of form by the browser 

समस्या को हल करने

संबंधित मुद्दे