2010-04-17 27 views
22

Tôi đang cố gắng sử dụng file_get_content của php ('url');php file_get_contents và &

Vấn đề là nếu url có '&' trong nó, ví dụ

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

nó tự động tạo ra một yêu cầu để www.google.com/?var1=1&var2=2

Làm thế nào để ngăn chặn điều đó xảy ra?

+0

bạn có thể chỉ cho một ít mã hơn xung quanh 'file_get_content() 'dòng, tôi nghi ngờ lỗi có thể nằm trong dòng trước đó. – gnarf

+0

Điều này cũng đang xảy ra với tôi !! đây có phải là cronjob trên godaddy không? –

+0

cùng một điều xảy ra với tôi, trong số 3 url chỉ có một là sản xuất & vì vậy không có cách nào để nói sử dụng curl, tôi muốn giải pháp trong chức năng này. file_get_contents() .. cảm ơn bạn – MFarooqi

Trả lời

2

Bạn nên cố gắng nhìn vào các thư viện cURL trong PHP mà sẽ cho phép bạn làm điều gì đó như:

$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); 

Sau đó bạn có thể nhận được kết quả từ $ data.

+0

Tại sao sử dụng cURL (mà người dùng có thể chưa cài đặt trên cài đặt PHP của họ, vì nó là phần mở rộng thêm) nếu file_get_contents hoạt động đúng? Trong trường hợp này nó trông giống như một cái gì đó kỳ lạ đang xảy ra với Mã hóa URL. –

+1

cURL là một tiện ích khá phổ biến ... và được thiết kế đặc biệt cho các yêu cầu URL. File_get_contents không được "thiết kế" cho URL. –

+1

Tôi không đồng ý rằng tệp_get_contents không được thiết kế cho URL. Kiểm tra hướng dẫn sử dụng cho hàm trên www.php.net và bạn sẽ thấy ví dụ đầu tiên thực sự chứng minh việc đọc một tệp qua HTTP. Nhưng tôi đồng ý rằng mục đích của nó kết thúc bằng các yêu cầu GET đơn giản nhất. Mọi thứ phức tạp hơn (POST, thao tác tiêu đề, tải lên tệp, v.v.) không được hỗ trợ. Tuy nhiên, tôi sẽ không khuyên bạn nên sử dụng cURL vì nó là phần mở rộng khá cũ. Thay vào đó, cách nhìn vào Zend_Http là một phần của khung công tác Zend và hoàn toàn là OO: http://framework.zend.com/manual/en/zend.http.client.html – Janci

0

Có vẻ như bạn thực tế có một chuỗi với "& amp;". Bạn có thể không nhìn thấy nó bởi vì bạn chỉ hiển thị đầu ra trong trình duyệt. Bạn nên sử dụng chế độ xem nguồn trình duyệt để hiển thị các phần tử html.

0

Sự cố rất có thể là một phần của mã PHP của bạn. Tôi nghi ngờ rằng những gì bạn nghĩ đang xảy ra không thực sự xảy ra.

tôi nghi ngờ rằng thay vì mã bạn đăng, bạn có lẽ grabbing một phần của URL mà từ một biến, chẳng hạn như:

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

Vang vọng rằng biến cho trình duyệt có thể được che giấu thực tế là bạn' đã vô tình mã hóa các ký tự đặc biệt trong bước trước đó, bởi vì trong trình duyệt một "& amp;" sẽ trông giống như "&". Cũng có thể yêu cầu file_get_contents() của bạn đang hoạt động chính xác và bạn nghĩ rằng vấn đề với mã hóa dấu hiệu & có thể là vấn đề ở một nơi khác - việc đăng mã nguồn thực tế có thể giúp xác định sự cố.

-1

Thực tế, không có gì sai khi sử dụng & làm dấu tách trường trong chuỗi truy vấn. Nó là hoàn hảo valid và thậm chí recommended by w3c. Vấn đề với việc sử dụng & là nó tương tác với các tham chiếu thực thể ký tự (có dạng &xxx;).

Ngoài ra, xem lưu ý trong PHP dẫn sử dụng cho url_encode() chức năng:

Hãy cẩn thận về biến có thể phù hợp với các thực thể HTML. Những thứ như & amp, & sao chép và & pound được phân tích cú pháp theo trình duyệt và thực thể thực tế là được sử dụng thay vì biến mong muốn . Đây là một rắc rối rõ ràng rằng W3C đã nói với mọi người khoảng trong nhiều năm. PHP hỗ trợ thay đổi đối số tách thành W3C được đề xuất nửa dấu hai chấm thông qua lệnh arg_separator .ini. Rất tiếc, hầu hết các nhân viên người dùng không gửi dữ liệu biểu mẫu ở định dạng được phân tách bằng dấu chấm phẩy này.A cách di chuyển khác quanh đây là sử dụng & thay vì & làm dấu phân cách .

Nếu bạn thực sự không thích những & trong URL của bạn, tôi muốn đề nghị để kiểm tra các thiết lập của arg_separator chỉ thị trong tập tin php.ini của bạn, mặc dù tôi không chắc chắn 100% nó ảnh hưởng đến cách làm thế nào file_get_contents sửa đổi các URL

+1

bất cứ ai xuống bỏ phiếu này, bạn có thể xin vui lòng bình luận về mối quan tâm của bạn? – Janci

+2

Vấn đề với bài đăng này là dấu và được biểu thị bằng & trong HTML. Nó chỉ được sử dụng trong một chuỗi được mã hóa HTML, ví dụ: trong nhưng * không bao giờ * trong URL. –

8

Tôi đồng ý với áp phích ban đầu của câu hỏi. Rất cụ thể:

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

Điều này đòi hỏi các cảm biến = biến giả để được thông qua, hoặc truy vấn sẽ trả lại kết quả BAD từ Google. Nếu tôi vượt qua STRING này thông qua đào tạo Quản lý, nó (file_get_contents PHP) thay thế "&" với "&" do đó Google không thích tôi:

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 
) 

Vì vậy, đây là giải pháp tôi đã đưa ra, sử dụng 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())); 

tôi cũng bao gồm mã (nhờ Marco K.) tôi tìm thấy trên các PHP website sử dụng một chức năng tùy chỉnh cho 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

Hãy thử thay thế đơn giản quote ' cho dấu nháy kép ":

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

nó có vẻ kỳ lạ, nhưng các công trình!

+0

Điều này hoạt động, nhưng tại sao ?? – Guillaume

+1

Điều này không hoạt động nếu chuỗi truy vấn của bạn được đặt bằng vars: $ var1 = 1; file_get_contents ("http://www.google.com/?var1=$var1&var2=2") sẽ làm cho chuỗi trở thành mã hóa đặc biệt của html được mã hóa. – dval

0

thử cấu hình này trong php.ini

allow_url_fopen = On 

nếu url sử dụng https, phải cấu hình

extension=php_openssl.dll 
Các vấn đề liên quan