2010-04-17 17 views
22

मैं php की file_get_content ('url') का उपयोग करने का प्रयास कर रहा हूं;php file_get_contents और &

बात करता है, तो url '&' उस में है, उदाहरण के

file_get_contents('http://www.google.com/?var1=1&var2=2')

यह स्वचालित रूप से www.google.com/?var1=1&var2=2

करने के लिए एक अनुरोध करने के लिए मैं ऐसा होने से कैसे रोकूं है?

+0

आप() 'file_get_content के चारों ओर एक छोटे से अधिक कोड दिखाया जा सका' लाइन की कोशिश, मुझे लगता है त्रुटि पिछली पंक्ति में हो सकती है। – gnarf

+0

यह मेरे साथ भी हो रहा है !! क्या यह किसी भी मौके से गोदाडी पर एक क्रोनबॉज है? –

+0

मेरे साथ एक ही चीज हो रही है, 3 यूआरएल में से केवल एक ही & का उत्पादन कर रहा है इसलिए कर्ल का उपयोग करने का कोई तरीका नहीं है, मैं इस फ़ंक्शन के भीतर समाधान चाहता हूं। file_get_contents() .. धन्यवाद – MFarooqi

उत्तर

2

आपको लगता है कि आप की तरह कुछ करने के लिए अनुमति होगी PHP में कर्ल पुस्तकालयों में देखने का प्रयास करना चाहिए: डेटा

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://mysite.com/file.php?blah=yar&test=blah"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$data = curl_exec($ch); 
curl_close($ch); 

फिर आप $ से परिणाम प्राप्त कर सकते हैं।

+0

अगर file_get_contents को ठीक से काम करना चाहिए तो curl (जिसे उपयोगकर्ता ने अपने PHP इंस्टॉलेशन पर स्थापित नहीं किया हो सकता है) का उपयोग क्यों करें? इस मामले में ऐसा लगता है कि यूआरएल एन्कोडिंग के साथ कुछ अजीब हो रहा है। –

+1

curl एक काफी आम विस्तार है ... और यह विशेष रूप से यूआरएल अनुरोधों के लिए डिज़ाइन किया गया है। File_get_contents URL के लिए "डिज़ाइन नहीं" है। –

+1

मैं इस बात से सहमत नहीं हूं कि file_get_contents को यूआरएल के लिए डिज़ाइन नहीं किया गया था। Www.php.net पर फ़ंक्शन के लिए मैन्युअल जांचें और आप देखेंगे कि पहला उदाहरण वास्तव में HTTP पर एक फ़ाइल पढ़ने का प्रदर्शन करता है। लेकिन मैं मानता हूं कि इसका उद्देश्य सबसे आसान जीईटी अनुरोधों के साथ समाप्त होता है। कुछ और जटिल (पोस्ट, हेरफेरिंग हेडर, फाइल अपलोड करना आदि) समर्थित नहीं है। हालांकि, मैं curl का उपयोग करने की अनुशंसा नहीं करता क्योंकि यह काफी पुराने एक्सटेंशन है। इसके बजाय, Zend_Http को देखने के बारे में, जो ज़ेंड फ्रेमवर्क का हिस्सा है और पूरी तरह से ओओ है: http://framework.zend.com/manual/en/zend.http.client.html – Janci

0

ऐसा लगता है कि वास्तव में आपको "& amp" के साथ एक स्ट्रिंग है। आप शायद इसे नहीं देख सकते क्योंकि आप ब्राउज़र में आउटपुट दिखाते हैं। HTML तत्वों को दृश्यमान बनाने के लिए आपको ब्राउज़र स्रोत दृश्य का उपयोग करना चाहिए।

0

समस्या आपके PHP कोड का सबसे अधिक संभावना हिस्सा है। मुझे संदेह है कि जो भी आप सोच रहे हैं वह वास्तव में नहीं हो रहा है।

मुझे लगता है कि नहीं बल्कि कोड आपके द्वारा पोस्ट की, तो आप शायद इस तरह के रूप में एक चर से कि URL के भाग हथियाने कर रहे हैं, की तुलना में:

$data = file_get_contents("http://example.com/?$myvariable"); 

गूंज कि ​​ब्राउज़र के लिए चर कि आप इस तथ्य छुपा हो सकता है ' पिछले चरण में अनजाने में विशेष वर्णों को एन्कोड किया गया है, क्योंकि ब्राउज़र में "& amp;" "&" जैसा दिखने वाला है।

यह भी संभव है कि आपका file_get_contents() अनुरोध सही तरीके से काम कर रहा है, और आपको लगता है कि & साइन एन्कोडिंग के साथ कोई समस्या है, कहीं और समस्या हो सकती है - वास्तविक स्रोत कोड पोस्ट करने से समस्या का निर्धारण करने में मदद मिल सकती है।

-1

वास्तव में, क्वेरी स्ट्रिंग में फ़ील्ड विभाजक के रूप में & का उपयोग करने में कुछ भी गलत नहीं है। यह पूरी तरह से valid और यहां तक ​​कि recommended by w3c है। & का उपयोग करने में समस्या यह है कि यह चरित्र इकाई संदर्भों के साथ इंटरैक्ट करता है (जिसमें &xxx; है)।

इसके अलावा, url_encode() समारोह के लिए PHP मैनुअल में टिप्पणी देखें:

चर HTML निकाय मेल खा सकता है के बारे में सावधान रहें। & amp, & कॉपी और & पाउंड जैसी चीजें ब्राउज़र द्वारा पार्स किए जाते हैं और वास्तविक इकाई वांछित चर नाम के बजाय प्रयोग किया जाता है। यह एक स्पष्ट परेशानी है कि डब्ल्यू 3 सी लोगों को वर्षों से बता रहा है। पीएचपी arg_separator .ini निर्देश के माध्यम से W3C-सुझाव सेमी-कोलन को तर्क विभाजक को बदलने का समर्थन करता है। दुर्भाग्यवश अधिकांश उपयोगकर्ता एजेंट में इस अर्द्ध-कोलन से अलग प्रारूप में फॉर्म डेटा नहीं भेजते हैं। इसके आसपास अधिक पोर्टेबल तरीका & के बजाय & विभाजक के रूप में उपयोग करें।

तुम सच में अपने URL में & पसंद नहीं है, मैं, अपने php.ini फ़ाइल में arg_separator निर्देश की सेटिंग की जांच करना सुझाव देंगे, हालांकि मैं यह रास्ता कैसे प्रभावित करती है 100% यकीन नहीं है file_get_contents यूआरएल

+1

जो भी इसे कम करता है, क्या आप अपनी चिंताओं पर टिप्पणी कर सकते हैं? – Janci

+2

इस पोस्ट के साथ समस्या यह है कि HTML में & द्वारा एक एम्पर्सेंड का प्रतिनिधित्व किया जाता है। इसका उपयोग केवल एक HTML- एन्कोडेड स्ट्रिंग में किया जाता है, उदा। लेकिन * कभी * एक यूआरएल में नहीं। –

8

संशोधित करता है मैं प्रश्न के मूल पोस्टर से सहमत हूं। बहुत विशिष्ट होना करने के लिए:

http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=301+E.+Linwood+Avenue++Turlock%2C+CA

इसके लिए आवश्यक है सेंसर = false चर पारित होने के लिए, या क्वेरी गूगल से खराब परिणाम देगा। अगर मैं file_get_contents के माध्यम से इस STRING गुजरती हैं, यह (PHP file_get_contents) की जगह "&" के साथ "&" तो गूगल मुझे पसंद नहीं है:

Array 
(
    [type] => 2 
    [message] => file_get_contents(http://maps.googleapis.com/maps/api/geocode/json?address=301 E. Linwood Avenue Turlock, CA&amp;sensor=false) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request 
) 

तो यह समाधान मैं के साथ आया था, http_build_query

उपयोग कर रहा है
$myURL = 'http://maps.googleapis.com/maps/api/geocode/json?'; 
     $options = array("address"=>$myAddress,"sensor"=>"false"); 
    $myURL .= http_build_query($options,'','&'); 

    $myData = file_get_contents($myURL) or die(print_r(error_get_last())); 

मैं भी कोड में शामिल हैं (धन्यवाद मार्को लालकृष्ण) मैं PHP < 5 के लिए एक कस्टम समारोह का उपयोग करने के PHP website पर पाया:

if (!function_exists('http_build_query')) { 
    function http_build_query($data, $prefix='', $sep='', $key='') { 
     $ret = array(); 
     foreach ((array)$data as $k => $v) { 
      if (is_int($k) && $prefix != null) { 
       $k = urlencode($prefix . $k); 
      } 
      if ((!empty($key)) || ($key === 0)) $k = $key.'['.urlencode($k).']'; 
      if (is_array($v) || is_object($v)) { 
       array_push($ret, http_build_query($v, '', $sep, $k)); 
      } else { 
       array_push($ret, $k.'='.urlencode($v)); 
      } 
     } 
     if (empty($sep)) $sep = ini_get('arg_separator.output'); 
     return implode($sep, $ret); 
    }// http_build_query 
}//if 
0

दोहरे उद्धरण " के लिए सरल बोली ' की जगह का प्रयास करें:

file_get_contents("http://www.google.com/?var1=1&var2=2")

यह अजीब है, लेकिन काम करता है लगता है!

+0

यह काम करता है, लेकिन क्यों ?? – Guillaume

+1

यह काम नहीं करता है यदि आपकी क्वेरी स्ट्रिंग वर्र्स के साथ सेट है: $ var1 = 1; file_get_contents ("http://www.google.com/?var1=$var1&var2=2") स्ट्रिंग को एचटीएमएल विशेष चार एन्कोडेड बनने का कारण बन जाएगा। – dval

0

php.ini में इस config

allow_url_fopen = On 

अगर उपयोग https यूआरएल, विन्यास चाहिए

extension=php_openssl.dll 
संबंधित मुद्दे