2010-01-10 4 views
8

Je sais que la page de résultats qui utilise la méthode GET peut être mise en signet alors que celle qui utilise POST ne le peut pas. Je connais aussi les restrictions des méthodes GET. Supposons maintenant que je souhaite créer un moteur de recherche qui utilise par défaut GET permettant aux utilisateurs de créer un signet, mais lorsque la longueur de la phrase de recherche dépasse la limite, passez en POST. Du côté serveur, j'utilise $ _GET ou $ _POST en fonction de ce qui est défini.Vous voulez utiliser les méthodes GET et POST

Est-ce faisable?
Si non, pourquoi?
Si oui, veuillez fournir un bref aperçu.

Merci

+0

Où voulez-vous prendre la décision - côté serveur ou côté client (javascript)? Prévoyez-vous que l'utilisateur fasse une recherche de plus de 1024 caractères? – ondra

Répondre

11

C'est faisable, pas de problème.

Il existe le tableau $_REQUEST qui fusionne les valeurs GET, POST et COOKIE, mais la meilleure solution serait de gérer GET et POST manuellement dans votre script.

Il suffit que votre moteur vérifie à la fois $_GET["variable"] et $_POST["variable"] et utilisez celui qui est défini. Si une variable est définie dans les deux méthodes, vous devez décider laquelle vous voulez donner la priorité. La seule différence notable entre les deux méthodes est qu'un paramètre GET a des limitations de taille en fonction du navigateur et du serveur Web destinataire (le POST a également des limites, mais elles sont généralement de l'ordre de plusieurs mégaoctets). Je pense que la règle générale est qu'une chaîne GET ne doit jamais dépasser 1024 caractères.

+3

Le problème de sécurité $ _REQUEST: http://thephpcode.blogspot.com/2008/09/request-security-problem.html – mauris

+0

@Pekka: Merci :) Et où puis-je ajouter la logique pour passer de GET à POST? – gameover

+0

Si vous utilisiez $ _GET ["xyz"] dans votre script jusqu'à présent, remplacez-le par une variable (par exemple, $ xyz) que vous remplissez avec la valeur GET ou la valeur POST quelque part au début de votre script. –

1

Vous pouvez utiliser quelque chose comme ce qui suit:

<?php 
function getParam($key) 
{  
    switch (true) { 
     case isset($_GET[$key]): 
      return $_GET[$key]; 
     case isset($_POST[$key]): 
      return $_POST[$key]; 
     case isset($_COOKIE[$key]): 
      return $_COOKIE[$key]; 
     case isset($_SERVER[$key]): 
      return $_SERVER[$key]; 
     case isset($_ENV[$key]): 
      return $_ENV[$key]; 
     default: 
      return null; 
    }  
} 
+4

Ou juste $ _REQUEST – user86297

+0

Vous n'avez aucun contrôle sur la fusion faite par $ _REQUEST, et ainsi il peut conduire à des problèmes de sécurité, voir le commentaire à la question de Pakka pour un lien. C'est aussi une méthode pratique pour relier $ _SERVER et $ _ENV, ce que $ _REQUEST ne fait pas. Cette méthode est employée par le Zend Framework. – hobodave

7

Voilà comment vous pouvez utiliser GET et POST en un:

<form action="myfile.php?var1=get1&amp;var2=get2&amp;var3=get3" method="post"> 

    <input type="hidden" name="var1" value="post1" /> 
    <input type="hidden" name="var2" value="post2" /> 

    <input type="submit" /> 
</form> 

Le PHP:

print_r($_REQUEST); 
// var1 = "post1" 
// var2 = "post2" 
// var3 = "get3" 

print_r($_GET) 
// var1 = "get1" 
// var2 = "get2" 
// var3 = "get3" 

print_r($_POST); 
// var1 = "post1" 
// var2 = "post2" 
+2

nécessite 'method =" post "' – bobince

+0

merci, édité. – nickf

1

Il est également bien d'être conscient que l'utilisation de GET ouvre la tentation parmi certains groupes d'utilisateurs de manipuler l'URL pour «voir ce qui ppens 'il est donc absolument nécessaire de s'assurer que votre code assainit correctement les variables d'entrée.

Bien sûr, vous le faisiez quand même ;-). Mais avec ça vaut la peine d'être doublement paranoïaque. Moi aussi, si j'utilise GET, je vais généralement définir un cookie et y déposer un identifiant, puis corréler cela avec une variable de la liste GET, juste pour m'assurer qu'il n'y a absolument aucun problème sur l'utilisateur a manipuler l'entrée et de les laisser voir quoi que ce soit d'origine avec l'utilisateur B.

1

Oui son faisables, bien que (à mon humble avis) la limite à laquelle GET devient lourde est nettement supérieur au seuil à partir duquel une interface utilisateur pour fournir autant l'information devient inutilisable. En outre, plus une requête que vous soumettez à un moteur de recherche classique est complexe, plus elle peut être résolue efficacement. Mais je suppose que vous avez vos raisons. La manière la plus simple, à partir des informations que vous avez fournies, d'y parvenir serait de changer la méthode de formulaire lors de l'exécution de GET à POST en utilisant javascript, par exemple.

<form method='GET' id='searchform' target='search.php' onsubmit=' 
    if (document.getElementById("searchdata")) { 
    if ((document.getElementById("searchdata").length >$some_threshold) 
     && (document.getElementById("searchform"))) { 
     // 2nd if in case this moved to action for button 
     document.getElementById("searchform").method="POST"; 
    } 
    } 
return true;'> 
<textarea name='searchdata' id='searchdata'> 
</textarea> 
<input type='submit' value='go get it'> 
</form> 

Qui également downgrade bien pour les clients non-javascript.

C.

1
function getQVar($key){ 
    return isset($_GET[$key]) ? $_GET[$key] : (isset($_POST[$key]) ? $_POST[$key] : null); 
} 
echo getQVar("name"); 

Passer autour _GET et $ _POST à ​​établir des priorités POST sur GET vars.

Questions connexes