2011-01-20 41 views
61

Tôi đang tạo trang tìm kiếm, nơi bạn nhập truy vấn tìm kiếm và biểu mẫu được gửi tới search.php?query=your query. Chức năng PHP nào là tốt nhất và tôi nên sử dụng để mã hóa/giải mã truy vấn tìm kiếm?Cách URL đúng mã hóa chuỗi trong PHP?

+2

Bạn có gặp bất kỳ sự cố nào không? Trình duyệt và PHP sẽ xử lý tự động điều này (ví dụ: đặt 'foo bar' vào trường văn bản, tạo' foo + bar' trong URL). –

+0

@Felix Tôi sẽ gọi tập lệnh tìm kiếm bằng cách sử dụng 'file_get_contents' –

Trả lời

108

Để sử dụng truy vấn URI urlencode/urldecode; cho bất cứ điều gì khác sử dụng rawurlencode/rawurldecode.

Sự khác biệt giữa urlencoderawurlencode

+0

* application/x-www-form-urlencoded * chỉ là một biến thể đặc biệt của * Phần trăm mã hóa * và chỉ được áp dụng để mã hóa dữ liệu biểu mẫu HTML. – Gumbo

+0

Mã hóa nào tốt hơn, dạng url được mã hóa hoặc phần trăm? –

+1

@Click Upvote: Chúng không thể so sánh theo cách đó. Định dạng * application/x-www-form-urlencoded * * là * định dạng * Phần trăm mã hóa * ngoại trừ không gian được mã hóa bằng '+' thay vì '% 20'. Và bên cạnh đó, * application/x-www-form-urlencoded * được sử dụng để mã hóa dữ liệu biểu mẫu trong khi * Phần trăm mã hóa * có cách sử dụng tổng quát hơn. – Gumbo

14

Được đặt tên khéo léo urlencode()urldecode().

Tuy nhiên, bạn không cần phải sử dụng urldecode() trên các biến xuất hiện trong $_POST$_GET.

+3

Tên 'thôurlencode' và' rawurldecode' ... –

2

Đây là trường hợp sử dụng của tôi, yêu cầu số lượng mã hóa vượt trội. Có thể bạn nghĩ rằng nó đã được tạo ra, nhưng chúng tôi chạy nó trên sản xuất. Thật trùng hợp, điều này bao gồm mọi loại mã hóa, vì vậy tôi đăng bài như một hướng dẫn.

Mô tả trường hợp sử dụng

Ai đó vừa mua thẻ quà tặng trả trước ("mã thông báo") trên trang web của chúng tôi. Các thẻ có URL tương ứng để đổi chúng. Khách hàng này muốn gửi email cho người khác. Trang web của chúng tôi bao gồm liên kết mailto cho phép họ thực hiện điều đó.

mã PHP

// The order system generates some opaque token 
$token = 'w%a&!e#"^2(^@azW'; 

// Here is a URL to redeem that token 
$redeemUrl = 'https://httpbin.org/get?token=' . urlencode($token); 

// Actual contents we want for the email 
$subject = 'I just bought this for you'; 
$body = 'I just bought a widget for you. Please enter your shipping details here: ' . $redeemUrl; 

// A URI for the email as prescribed 
$mailToUri = 'mailto:?subject=' . rawurlencode($subject) . '&body=' . rawurlencode($body); 

// Print an HTML element that links to that page 
echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>'; 

Lưu ý: các giả định ở trên bạn đang cung cấp cho một tài liệu text/html. Nếu loại phương tiện đầu ra của bạn là text/json thì chỉ cần sử dụng $retval['url'] = $mailToUri; vì mã hóa đầu ra được xử lý bởi json_encode().

trường hợp thử nghiệm

  1. Chạy mã trên một trang web thử nghiệm PHP (là có một kinh điển Tôi nên đề cập đến ở đây?)
  2. Nhấp vào liên kết
  3. Gửi email
  4. Nhận email
  5. Nhấp vào liên kết đó

Bạn sẽ thấy:

"args": { 
    "token": "w%a&!e#\"^2(^@azW" 
}, 

Và dĩ nhiên đây là đại diện JSON của $token trên.

Các vấn đề liên quan