2010-11-26 17 views
42

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

एचटीएमएल इस प्रकार दिखाई देगा ...

<form name="example" action="action.php" method="POST"> 
    <input type="text" name="one"> 
    <input type="text" name="two"> 
    <input type="text" name="three"> 
    <input type="submit" value="Submit!"> 
</form> 

action.php इस प्रकार दिखाई देगा ...

if(error_check($_POST['one']) == true){ 
    header('Location: form.php'); 
    // Here is where I need the data to POST back to the form page. 
} else { 
    // function to insert data into database 
    header('Location: posted.php'); 
} 

किसी त्रुटि के मामले में, मुझे इसकी जरूरत वापस पोस्ट करने के लिए पहले पृष्ठ पर। मैं जीईटी का उपयोग नहीं कर सकता, क्योंकि इनपुट बहुत बड़ा होगा। यदि संभव हो तो मैं सत्र का उपयोग नहीं करना चाहता हूं। क्या यह संभव है?

+0

http: //www.phpfreaks पर कुछ धागे के अनुसार।कॉम/फ़ोरम/php-codeing-help/header ('location-x-php') - प्रश्न-जा रहा-2-पेज-बैक /, आप 'हेडर ("स्थान: जावास्क्रिप्ट: window.history का उपयोग करने में सक्षम हो सकते हैं। जाओ (-1); ");' (परीक्षण नहीं किया गया) – cambraca

+0

अच्छा ... मैं भी एक त्रुटि संदेश जोड़ने की कोशिश कर रहा था अगर मुझे जरूरत थी। वह उस अनुमति नहीं देगा। – Yoshiyahu

उत्तर

18

यदि आप सत्रों का उपयोग नहीं करना चाहते हैं, तो केवल एक ही चीज जो आप कर सकते हैं वह उसी पृष्ठ पर पोस्ट है। वैसे भी कौन सा आईएमओ सबसे अच्छा समाधान है।

// form.php 

<?php 

    if (!empty($_POST['submit'])) { 
     // validate 

     if ($allGood) { 
      // put data into database or whatever needs to be done 

      header('Location: nextpage.php'); 
      exit; 
     } 
    } 

?> 

<form action="form.php"> 
    <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>"> 
    ... 
</form> 

यह और अधिक सुरुचिपूर्ण बनाया जा सकता है, लेकिन आप अंदाजा हो ...

+0

वर्तमान में मैं जो कर रहा हूं, लेकिन मैं अपने सर्वर क्रियाओं को अलग-अलग पृष्ठों पर साफ-सफाई के लिए बनाने की कोशिश कर रहा हूं ... – Yoshiyahu

+0

बस उत्सुक है, क्या POST डेटा nextpage.php पर उपलब्ध होगा? – jerjer

+0

@jerjer नहीं, यही कारण है कि आपको या तो पृष्ठ पर सभी प्रसंस्करण करने की आवश्यकता है या पृष्ठों के बीच डेटा को बनाए रखने के लिए सत्रों का उपयोग करना है। – deceze

0

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

संपादित करें:

यदि सुरक्षा एक चिंता का विषय, डेटा सत्यापित करने के लिए सबसे अच्छा तरीका है एक AJAX अनुरोध प्रदर्शन है। AJAX अनुरोध से प्रतिक्रिया यह निर्धारित करेगी कि फ़ॉर्म सबमिट किया जाना चाहिए या नहीं।

+1

आपको अभी भी सर्वर पर डेटा जांचना चाहिए अन्यथा आप एक सुरक्षा समस्या के साथ समाप्त हो सकते हैं। –

+0

बिल्कुल मैं क्या सोच रहा था, कॉर्क। सर्वर साइड त्रुटि जांच हमेशा सर्वोत्तम होती है। – Yoshiyahu

+0

हमेशा सुरक्षा समस्याएं होती हैं, भले ही आप डेटा को कैसे सत्यापित करते हैं। अगर सुरक्षा चिंता का विषय है, तो सत्यापन के लिए AJAX अनुरोध जाने का तरीका हो सकता है। –

6

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

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

+0

शानदार विचार, और आपने मेरे प्रश्न का उत्तर दिया। हालांकि, मैं इस परियोजना पर जावास्क्रिप्ट से दूर जा रहा हूँ। – Yoshiyahu

+1

ऐसा नहीं है। हेडर ('HTTP/1.1 307 अस्थायी रीडायरेक्ट') और हेडर ('HTTP/1.1 308 स्थायी रीडायरेक्ट') निम्न शीर्षलेख ('स्थान: new_url') का उपयोग करके रीडायरेक्ट करने के लिए मूल विधि को बनाए रखता है। – Patanjali

+0

आपको एहसास है कि यह उत्तर 2010 से था जब ये स्थिति कोड मौजूद नहीं थे या कम से कम काफी हद तक असमर्थित थे। यदि आपके पास इसके बारे में ज्ञान है तो आप ओपी के मुद्दे को हल करने के लिए इन नए स्टेटस कोडों का उपयोग कैसे करें, इसका एक संपूर्ण उत्तर पोस्ट कर सकते हैं। मुझे लगता है कि बहुत से लोगों को यह उपयोगी लगेगा। –

25
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl 
function do_post_request($url, $data, $optional_headers = null) 
{ 
    $params = array('http' => array(
       'method' => 'POST', 
       'content' => $data 
      )); 
    if ($optional_headers !== null) { 
    $params['http']['header'] = $optional_headers; 
    } 
    $ctx = stream_context_create($params); 
    $fp = @fopen($url, 'rb', false, $ctx); 
    if (!$fp) { 
    throw new Exception("Problem with $url, $php_errormsg"); 
    } 
    $response = @stream_get_contents($fp); 
    if ($response === false) { 
    throw new Exception("Problem reading data from $url, $php_errormsg"); 
    } 
    return $response; 
} 
+5

यह अधिक योग्य है ध्यान ... – ryanwinchester

+0

आप एक ही प्रपत्र के साथ एक विशिष्ट पृष्ठ पर रीडायरेक्ट करने के लिए इसका उपयोग कैसे करते हैं? – Rich

0

अपनी सामग्री के लिए एक स्मार्ट टेम्पलेट का उपयोग करें, बस पोस्ट सरणी को एक smarty सरणी के रूप में सेट करें और टेम्पलेट खोलें।

if(correct){ 
    header("Location: passed.php"); 
} else { 
    $smarty->assign("variables", $_POST); 
    $smarty->display("register_error.php"); 
    exit; 
} 

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

अगर तुम सिर्फ रूप में वहाँ त्रुटि पृष्ठ और गूंज जानकारी पर अपने प्रपत्र को पुन: कर सकते हैं या आप से एक बात में गैर महत्वपूर्ण डेटा वापस भेजने और प्राप्त यह

पूर्व सकता है नहीं।

register.php?name=mr_jones&address==...... 
echo $_GET[name]; 
संबंधित मुद्दे