2012-12-15 8 views
5

मुझे आश्चर्य है कि तकनीक का उपयोग करते समय उपयोगकर्ताओं को दो बार फॉर्म पोस्ट करने से रोकने के लिए उपयोग की जाने वाली तकनीकों का क्या उपयोग किया जा सकता है और फिर सबमिट करना चुना जाता है?

उदा। मेरे पास regiter.php के अंदर फॉर्म है और register.php के अंदर भी इसे संसाधित करता है।

पहला मैं अन्य फाइल में संसाधित कर सकता हूं उदा। register_process.php और register.php पर रीडायरेक्ट करें, लेकिन फिर मुझे लगभग 20 नए पेज बनाना होगा और बहुत सारे कोड स्थानांतरित करना होगा, मुझे वह विकल्प नहीं चाहिए।

मैं headers के साथ खेल सकते मुझे नहीं सटीक चाल याद लेकिन उस के साथ कुछ बुरा अनुभव - उपयोगकर्ताओं के लिए यह ताज़ा करने के बाद पृष्ठ पर पुराने डेटा देखा ...

मैं सिर्फ सफलता पर अनुप्रेषित सकता है dummy.php और dummy.php से कूद वापस register.php तो भले ही वे ताज़ा पेज ब्राउज़र नहीं होता फिर से पोस्ट कुछ को, फिर भी इसके खिलाफ उनका इस्तेमाल वापस बटन और ग की रक्षा नहीं करता फिर से पोस्ट हो रहा है, मुझे पता है कि मैं पेज की समयसीमा समाप्त कर सकता हूं, लेकिन मुझे लगता है कि मेरे लिए और शायद अन्य उपयोगकर्ताओं को पेज की समयसीमा त्रुटि देखने के लिए परेशान अनुभव।

उपयोग एक बार लोड पेज कि फार्म के साथ पोस्ट और एक बार इस्तेमाल पुन: उपयोग नहीं किया जा सकता है प्रत्येक फार्म के लिए कुछ अद्वितीय "पहुँच कुंजी", हालांकि मैं एक तरह से उस सुविधा का लॉजिक्स के साथ संघर्ष। कैसे पता चलेगा कि इसे MySQL डीबी में संग्रहीत किए बिना इस्तेमाल किया गया था, मुझे लगता है कि टाइम आधारित एक्सेसिशन बहुत अच्छा नहीं है क्योंकि कुछ उपयोगकर्ता पृष्ठ खोलने और फॉर्म सबमिट करने के बीच लंबे समय तक ले सकते हैं।

मुझे उपयोगकर्ताओं को फ़ॉर्म को फिर से प्रस्तुत करने से बचने के लिए और सुझावों की आवश्यकता है।

उत्तर

1

इस प्रयास करें:

<?php 
session_start(); 
if(strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) { 
    $_SESSION['postdata'] = $_POST; 
    header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']); 
    exit; 
} 
if(isset($_SESSION['postdata'])) { 
    $_POST = $_SESSION['postdata']; 
    unset($_SESSION['postdata']); 
} 

यह मूलतः पोस्ट डेटा को फिर से अनुरोध करने के लिए एक GET अनुरोध के रूप में बचाने के लिए और ब्राउज़र का कारण होगा।

+0

मैं ऐसी ही कुछ किया था, हालांकि कोड के अधिक लाइनों :) इस्तेमाल किया समस्या कि क्या उन्होंने फ़ॉर्म सबमिट करने से पहले पेज को ताज़ा है, '$ _SESSION [ 'POSTDATA']' वहाँ अब और पी.एस. नहीं होगा 'Strcasecmp ($ _ सर्वर ['REQUEST_METHOD']," POST ") का उपयोग करने के किसी भी फायदे' '_SERVER ['REQUEST_METHOD'] ==" POST "' के बजाय '? –

1

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

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

+0

नहीं धन्यवाद मुझे नहीं संगतता समस्या के कारण जावास्क्रिप्ट के किसी भी रूप में उपयोग करना चाहते सिर्फ एचटीएमएल और php –

0

जब आप पहले विकल्प पर विचार करते हैं, तो मुझे आपकी वेबसाइट के डिज़ाइन (प्रोग्रामिंग डिज़ाइन ^^) के बारे में पता नहीं है, लेकिन आपको केवल 1 पृष्ठ की आवश्यकता होनी चाहिए। आइए मान लें कि आप सभी पैरामीटर के साथ redirect.php को कॉल करते हैं, आपको अपने कंट्रोलर को कॉल करना चाहिए और आपके नियंत्रक को पैरामीटर के बावजूद पता होना चाहिए कि उनके साथ क्या करना है।

प्रोग्रामिंग के दौरान कुछ अमूर्तता और अच्छी डिजाइन करने में सक्षम होने की एक अच्छी आदत है, यह उन परिस्थितियों में बहुत मदद करता है।

+0

मैंने इस बारे में अभी भी सोच रहा था विचार करना सबसे अच्छा क्या है। –

0

मुझे लगता है कि सबसे अच्छा समाधान कुछ इस तरह होगा:
* एक md5 या पोस्ट डेटा के बेस 64
* एक सत्र चर के साथ इस हैश तुलना बनाने (यह कॉल $ _SESSION [ 'पोस्ट'])
* अगर हैश से मेल खाते हैं, को छोड़ जो कुछ भी इस को बचाने के लिए एक चेतावनी है और उत्पादन चाहिए
* अगर हैश मेल नहीं खाते, या हैश मौजूद नहीं है
* वर्तमान हैश के साथ सत्र चर निर्दिष्ट
* सहेज सकता हूँ जो कुछ भी करना चाहिए

+0

बेस 64 _not_ बनाता हैश बनाता है लेकिन यह कोड-स्वतंत्र ASCII वर्णों में 8-बिट डेटा एन्कोड करता है। बेस 64 के साथ 8 एमबी डेटा एन्कोडिंग 8 एमबी से बड़ा होगा, डेटा के 8 एमबी के एमडी 5 हैश का निर्माण 16 बाइट्स लंबे हैश होगा। – hmundt

0

अन्य तरीका सेंट है सत्र चर में पिछले पोस्ट अयस्क, और देखें कि क्या बराबर है, इस तरह:

<?php 
... program ... 
if ($_SESSION['PREPOST'] == $_POST) { 
    // DO SOMETHING 
} 
... program ... 
$_SESSION['PREPOST'] = $_POST; 
?> 
संबंधित मुद्दे