2009-03-17 15 views
19

मैं here मुझे लगता है कि मैं क्या चाहते हैं करता है पर निम्न कोड पाया है, लेकिन यह काम नहीं करता:PHP हेडर() फ़ंक्शन का उपयोग करके आप किसी पृष्ठ पर कैसे पोस्ट करते हैं?

$host = "www.example.com"; 
$path = "/path/to/script.php"; 
$data = "data1=value1&data2=value2"; 
$data = urlencode($data); 

header("POST $path HTTP/1.1\r\n"); 
header("Host: $host\r\n"); 
header("Content-type: application/x-www-form-urlencoded\r\n"); 
header("Content-length: " . strlen($data) . "\r\n"); 
header("Connection: close\r\n\r\n"); 
header($data); 

मैं एक मध्यम पृष्ठ पर उपयोगकर्ताओं को भेजने और फिर JavaScript का उपयोग कर के बिना प्रपत्र डेटा पोस्ट करने के लिए देख रहा हूँ उन्हें पुनर्निर्देशित करने के लिए। मैं भी जीईटी का उपयोग नहीं करना चाहता हूं इसलिए बैक बटन का उपयोग करना उतना आसान नहीं है।

क्या इस कोड के साथ कुछ गलत है? या क्या एक बेहतर तरीका है?

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

+0

भी देखें: [POST अनुरोध को पुनर्निर्देशित करें और डेटा रखें। संभव है?] (Http://stackoverflow.com/q/5605432/367456) और [हेडर() और खराब शीर्षलेख समस्याओं के साथ PHP पोस्ट] (http://stackoverflow.com/q/1586450/367456) – hakre

उत्तर

13

हैडर समारोह HTTP प्रतिसाद शीर्षलेख उपयोगकर्ता (यानी आप इसका इस्तेमाल नहीं कर सकते हैं अनुरोध हेडर बनाने के लिए करने के लिए वापस भेजने के लिए प्रयोग किया जाता है।

मैं पूछ सकता हूँ तुम ऐसा क्यों कर रहे हैं? क्यों जब आप कर सकते हैं एक पोस्ट अनुरोध अनुकरण बस वहां पर और फिर डेटा पर कार्य करें? मुझे लगता है कि निश्चित रूप से script.php आपके सर्वर पर रहता है।

POST अनुरोध बनाने के लिए, fsockopen() का उपयोग कर होस्ट को एक टीसीपी कनेक्शन खोलें, फिर ओपी में हेडर फ़ंक्शंस में उपयोग किए गए वही मानों के साथ fsockopen() से वापस हैंडलर पर fwrite() का उपयोग करें। वैकल्पिक रूप से, आप curl का उपयोग कर सकते हैं।

+0

Thxs, I थोड़ा उलझन में था और हाँ, आप सही हैं, लिपि के भीतर एक बेहतर तरीका था, कोई पोस्टिंग आवश्यक नहीं था। –

2

सेलरीमैन ने जो कहा, उसके अलावा, PEAR में कक्षाओं पर एक नज़र डालें, वहां HTTP अनुरोध कक्षाएं हैं जिनका उपयोग आप अपने PHP वितरण में कर्ल एक्सटेंशन स्थापित नहीं होने पर भी कर सकते हैं।

-1
private function sendHttpRequest($host, $path, $query, $port=80){ 
    header("POST $path HTTP/1.1\r\n"); 
    header("Host: $host\r\n"); 
    header("Content-type: application/x-www-form-urlencoded\r\n"); 
    header("Content-length: " . strlen($query) . "\r\n"); 
    header("Connection: close\r\n\r\n"); 
    header($query); 
} 

यह आप तुरंत

+0

यह मेरे लिए काम नहीं करता है - जैसे ही मैं उस कोड को जोड़ता हूं, मुझे एक (अनौपचारिक) आंतरिक सर्वर त्रुटि मिलती है। – tog22

+7

पैरामीटर हस्ताक्षर में इसका उपयोग क्यों नहीं किया जाता है जब इसका उपयोग नहीं किया जाता है? – alex

+0

@Zurechtweiser शायद उसने पूछा ताकि आप जवाब दे सकें – Isaac

1

मिल जाएगा एक अच्छा वर्ग करता है कि आप क्या चाहते हैं नहीं है। इसे यहां डाउनलोड किया जा सकता है: http://sourceforge.net/projects/snoopy/

3

इसका उत्तर आज बहुत जरूरी है क्योंकि हर कोई वेब सेवाओं का उपभोग करने के लिए कर्ल का उपयोग नहीं करना चाहता। इसके अलावा PHP निम्नलिखित कोड

function get_info() 
{ 
    $post_data = array(
     'test' => 'foobar', 
     'okay' => 'yes', 
     'number' => 2 
    ); 

    // Send a request to example.com 
    $result = $this->post_request('http://www.example.com/', $post_data); 

    if ($result['status'] == 'ok'){ 

     // Print headers 
     echo $result['header']; 

     echo '<hr />'; 

     // print the result of the whole request: 
     echo $result['content']; 

    } 
    else { 
     echo 'A error occured: ' . $result['error']; 
    } 

} 

function post_request($url, $data, $referer='') { 

    // Convert the data array into URL Parameters like a=b&foo=bar etc. 
    $data = http_build_query($data); 

    // parse the given URL 
    $url = parse_url($url); 

    if ($url['scheme'] != 'http') { 
     die('Error: Only HTTP request are supported !'); 
    } 

    // extract host and path: 
    $host = $url['host']; 
    $path = $url['path']; 

    // open a socket connection on port 80 - timeout: 30 sec 
    $fp = fsockopen($host, 80, $errno, $errstr, 30); 

    if ($fp){ 

     // send the request headers: 
     fputs($fp, "POST $path HTTP/1.1\r\n"); 
     fputs($fp, "Host: $host\r\n"); 

     if ($referer != '') 
      fputs($fp, "Referer: $referer\r\n"); 

     fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
     fputs($fp, "Content-length: ". strlen($data) ."\r\n"); 
     fputs($fp, "Connection: close\r\n\r\n"); 
     fputs($fp, $data); 

     $result = ''; 
     while(!feof($fp)) { 
      // receive the results of the request 
      $result .= fgets($fp, 128); 
     } 
    } 
    else { 
     return array(
      'status' => 'err', 
      'error' => "$errstr ($errno)" 
     ); 
    } 

    // close the socket connection: 
    fclose($fp); 

    // split the result header from the content 
    $result = explode("\r\n\r\n", $result, 2); 

    $header = isset($result[0]) ? $result[0] : ''; 
    $content = isset($result[1]) ? $result[1] : ''; 

    // return as structured array: 
    return array(
     'status' => 'ok', 
     'header' => $header, 
     'content' => $content); 

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