2011-01-20 11 views
61

Tworzę stronę wyszukiwania, w której wpisujesz zapytanie, a formularz jest przesyłany pod numer search.php?query=your query. Która funkcja PHP jest najlepsza i którą powinienem użyć do kodowania/dekodowania zapytania?Jak prawidłowo URL kodować ciąg w PHP?

+2

Czy występują jakieś problemy? Przeglądarki i PHP powinny obsługiwać to automatycznie (np. Wstawiając "pasek foo" w polu tekstowym, tworzy w adresie URL 'foo + bar'). –

+0

@Felix Zadzwonię do skryptu wyszukiwarki używając 'file_get_contents' –

Odpowiedz

108

Dla zapytania URI użyj urlencode/urldecode; dla czegokolwiek innego użyj rawurlencode/rawurldecode.

Różnica urlencode i rawurlencode jest

+0

* application/x-www-form-urlencoded * to tylko specjalny wariant * Procent-Kodowanie * i stosuje się tylko do kodowania danych formularzy HTML. – Gumbo

+0

Które kodowanie jest lepsze, czy kod formułowo-urnowy, czy procent? –

+1

@Click Upvote: Nie można ich porównywać w ten sposób. Format * application/x-www-form-urlencoded * to * format * Procent-Kodowanie * z tym wyjątkiem, że przestrzeń jest zakodowana za pomocą '+' zamiast '% 20'. Poza tym, * application/x-www-form-urlencoded * służy do kodowania danych formularzy, podczas gdy * Procent-Kodowanie * ma bardziej ogólne zastosowanie. – Gumbo

14

Sprytnie nazwane urlencode() i urldecode().

Jednak nie powinieneś używać urldecode() dla zmiennych, które pojawiają się w $_POST i $_GET.

+3

Sprytnie nazwany' rawurlencode' i 'rawurldecode' ... –

2

Oto mój przypadek użycia, który wymaga wyjątkowej ilości kodowania. Może uważasz, że to się udało, ale uruchamiamy to na produkcji. Przypadkowo obejmuje to każdy rodzaj kodowania, więc publikuję jako samouczek.

przypadków użycia Opis

Ktoś właśnie kupił karty prepaid prezent („tokena”) na naszej stronie internetowej. Tokeny mają odpowiednie adresy URL, aby je wykorzystać. Ten klient chce wysłać go do kogoś innego. Nasza strona internetowa zawiera link mailto, który pozwala im to zrobić.

kod 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>'; 

Uwaga: powyższa zakłada jesteś wyprowadzanie do dokumentu text/html. Jeśli typem nośnika wyjściowego jest text/json, po prostu użyj $retval['url'] = $mailToUri;, ponieważ kodowanie wyjścia jest obsługiwane przez json_encode().

przypadek testowy

  1. Uruchomienie kodu na stronie testowej PHP (istnieje kanoniczny należałoby wspomnieć tutaj?)
  2. Kliknij link
  3. Wyślij email
  4. Uzyskaj wiadomość e-mail
  5. Kliknij ten link

Powinieneś zobaczyć:

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

I oczywiście jest to reprezentacja JSON $token powyżej.