2013-01-07 7 views
17

Sono in una piccola discussione con il mio capo sugli URL che utilizzano i parametri GET senza valore. Per esempio.È una cattiva pratica utilizzare un parametro GET (in URL) senza valore?

http://www.example.com/?logout

vedo questo tipo di legame abbastanza spesso sul web, ma naturalmente, questo non significa che sia una buona cosa. Egli teme che questo non è standard e potrebbe portare ad errori inaspettati, in modo che preferisce, come me, usare qualcosa come:

http://www.example.com/?logout=yes

Nella mia esperienza, non ho mai incontrato alcun problema utilizzando parametri vuoti, e a volte hanno più senso per me (come in questo caso, dove ?logout=no non avrebbe senso, quindi il valore di "logout" è irrilevante e vorrei solo verificare la presenza del parametro lato server, non per il suo valore). (Sembra anche più pulito.)

Tuttavia non riesco a trovare conferma che questo tipo di utilizzo sia effettivamente valido e quindi in realtà non può causare alcun problema.

Avete qualche link a riguardo?

+1

Finché stai usando solo 'isset ($ _ GET [ 'disconnessione']);' e sei contento di questo, non vedo alcun problema . –

+0

Esattamente quello che sto facendo. :) – s427

risposta

16

RFC 2396, "Uniform Resource Identifiers (URI): Sintassi generico", §3.4, "componente di query" è la fonte autorevole di informazioni sulla stringa di query, e afferma:

Il componente di query è una stringa di informazioni da interpretare da la risorsa.

[...]

All'interno di un componente di query, i caratteri ";", "/", "?" ":", "@", "&", "=", " + ",", ", e" $ "sono riservati.

RFC 2616, "Hypertext Transfer Protocol - HTTP/1.1", §3.2.2, "URL http", non ridefinisce questo.

In breve, la stringa di query che date ("logout") è perfettamente valida.

+2

Grazie per il riferimento preciso. :-) Ecco il link diretto se qualcuno è interessato: https://tools.ietf.org/html/rfc2396#page-15. Rilevante anche: https://tools.ietf.org/html/rfc1738#page-9 (citato in un'altra risposta). – s427

3

È perfettamente funzionante e non causerà alcun errore. Sebbene oggigiorno la maggior parte dei framework sia basata su MVC, nell'URL è necessario menzionare une un azione, quindi sembra più simile a /users/logout (a proposito, StackOverflow utilizza tale URL per registrare gli utenti;).

L'affermazione che può causare errori a me suona come le applicazioni accedono manualmente il grezzo $_GET, e Sono assolutamente convinta che la costruzione di applicazioni senza un quadro (che di solito fornisce uno stack MVC e un router/dispatcher) è il vera cosa pericolosa qui.

+0

"vera cosa pericolosa" come in "se davvero devi trovare qualcosa di pericoloso nel tuo esempio", o come in "MAI fai questo"? – s427

+0

Il primo :) Ancora, lo sviluppo in semplice PHP, o vanilla JS, o comunque utilizzando solo un linguaggio di programmazione senza alcuna libreria non è una pratica intelligente per evidenti resons – Raffaele

7

Un valore non è richiesto per la chiave per avere alcun effetto. Neanche l'URL è meno valido, l'URL RFC1738 non lo elenca come parte richiesta dell'URL.

Se non si ha realmente bisogno di un valore, è solo una questione di preferenza.

http://example.com/?logout 

è tanto un URL valido come

http://example.com/?logout=yes 

Tutto differenza che fa è che se si vuole fare in modo che il "sì" bit è stato assolutamente impostato, è possibile controllare per la sua valore. Come:

if(isset($_GET['logout']) && $_GET['logout'] == "yes") { 
    // Only proceed if the value is explicitly set to yes 

Se si vuole solo sapere se la chiave logout è stato fissato da qualche parte nella URL, basterebbe elencare solo la chiave senza alcun valore assegnato ad esso. È quindi possibile controllare in questo modo:

if(isset($_GET['logout'])) { 
    // Continue regardless of what the value is set to (or if it's left empty) 
+0

Grazie. Navigando sul link che hai dato, ho anche trovato https://tools.ietf.org/html/rfc2396#page-15 che è menzionato in un'altra risposta. – s427