2010-04-17 4 views
22

Я пытаюсь использовать php's 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

Это происходит со мной! это крона на godaddy? –

+0

То же самое происходит со мной, из 3-х URL-адресов только один производит &, так что невозможно сказать, использовать curl, я хочу решения в рамках этой функции. file_get_contents() .. спасибо – MFarooqi

ответ

2

Вы должны попытаться искать в библиотеках CURL в 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

Зачем использовать cURL (который пользователь, возможно, не установил на их установке PHP, поскольку это дополнительное расширение), если file_get_contents должен работать правильно? В этом случае он просто выглядит как нечто странное происходит с кодировкой URL. –

+1

cURL - довольно распространенное расширение ... и оно специально предназначено для запросов URL. File_get_contents не «спроектирован» для URL-адресов. –

+1

Я не согласен с тем, что file_get_contents не был предназначен для URL-адресов. Проверьте руководство для функции на www.php.net, и вы увидите, что первый пример фактически демонстрирует чтение файла через HTTP. Но я согласен с тем, что цель заканчивается самыми простыми запросами GET. Все более сложное (POST, манипулирование заголовками, загрузка файлов и т. Д.) Не поддерживается. Однако я бы не рекомендовал использовать cURL, поскольку это довольно старое расширение. Вместо этого, как насчет поиска в Zend_Http, который является частью Zend Framework и полностью OO: 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"); 

Повторяя эту переменную в браузере может скрываться тот факт, что вы» ve непреднамеренно закодированные специальные символы на предыдущем шаге, потому что в браузере «& amp;» будет выглядеть так: «&».

Возможно также, что ваш запрос file_get_contents() работает правильно, и то, что, по вашему мнению, является проблемой при кодировании знака &, может быть проблемой в другом месте - публикация фактического исходного кода может помочь определить проблему.

-1

На самом деле, нет ничего плохого в использовании & в качестве разделителя полей в строке запроса. Это совершенно valid и даже recommended by w3c. Проблема с использованием & заключается в том, что он взаимодействует с ссылками на символьные сущности (который имеет форму &xxx;).

Также смотрите примечание в PHP руководстве для url_encode() функции:

Будьте осторожны переменных, которые могут совпасть HTML сущности. Такие вещи, как & усилителя, & копии и & фунта разбираются браузера и фактический объект является вместо желаемого переменной имени. Это очевидная проблема, что W3C годами рассказывал людям о . PHP поддерживает изменение аргумента разделитель на W3C-предложенный полутолкня через arg_separator . Директива .ini. К сожалению, большинство пользовательских агентов не отправляют данные формы в в этом формате с разделителями с запятой.A более портативный способ вокруг использовать & вместо & как разделитель.

Если вы действительно не нравится & в ваших URL-адресов, я хотел бы предложить, чтобы проверить настройку arg_separator директивы в вашем файле php.ini, хотя я не 100% уверен, что это влияет на то, насколько file_get_contents изменяет URL-адреса

+1

Кто бы ни проголосовал за это, не могли бы вы прокомментировать свои проблемы? – Janci

+2

Проблема с этим сообщением заключается в том, что амперсанд представлен & в HTML. Он используется только в строках, закодированных в HTML, например. в но * никогда * в URL-адресе. –

8

Согласен с оригинальной постерной вопрос. Чтобы быть очень конкретным:

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

Это требует датчик = ложная переменная передается, или запрос будет возвращать ПЛОХИЕ результаты от Google. Если я прохожу эту строку через file_get_contents, он (PHP file_get_contents) заменяет «&» с "&" так Google не любит меня:

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 website использовать пользовательскую функцию для PHP < 5:

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

Это не работает, если ваша строка запроса задана с помощью vars: $ var1 = 1; file_get_contents ("http://www.google.com/?var1=$var1&var2=2") приведет к тому, что строка станет закодированной специальной кодировкой html. – dval

0

попробовать этот конфиг в php.ini

allow_url_fopen = On 

, если использовать префикс HTTPS, необходимо CONFIG

extension=php_openssl.dll 
Смежные вопросы