2010-10-08 3 views
1

Était en train d'expérimenter avec un post HTTP de base avec php et a rencontré ce problème.php codé valeurs post param

1.php:

<head> 
    <script src="/scripts/jquery.js"></script> 
</head> 
<body> 

    <script> 
     function hw(){ 
      $.ajax({ 
       type: 'POST', 
       url: '/2.php', 
       data: 'param=a+b+c', 
       success: function(d){ 
       console.log('server said ' + d); 
       } 
      }); 

     } 
    </script> 
    <button onclick="javascript:hw();">CLick me</button> 
</body> 

2.PHP:

<?php 
echo $_POST['param']; 
?> 

l'appel retourne Ajax avec 'a b c' au lieu de 'a + b + c'. Pourquoi est-ce que '+' est encodé en '' (espace)?

J'ai ensuite essayé d'utiliser le type de contenu de la demande de publication en tant que 'text/plain' au lieu de 'application/x-www-form-urlencoded' par défaut. Dans ce cas, $_POST['param'] est vide? Je veux comprendre ce qui se passe exactement dans ces deux cas. Que dois-je faire du côté serveur pour récupérer les données d'origine ('+')?

Répondre

3

Utilisez data: {param: 'a+b+c'}

+1

Depuis qu'il utilise jQuery, c'est la solution la plus simple et la plus propre! +1! – jwueller

+0

pourquoi cela fonctionne-t-il? jquery utilise encodeURIComponent en interne? – letronje

+0

@letronje J'ai vérifié la source jquery, et trouvé: s [s.length] = encoderURIComponent (clé) + "=" + encoderURIComponent (valeur); – barbushin

5

Le type de contenu n'a rien à voir avec la requête URL contenant + car ce symbole est l'équivalent codé en URL d'un espace par RFC 1738. Utilisez% 2B comme alternative à la bibliothèque.

+0

Que dois-je faire sur le côté serveur pour récupérer les données d'origine (« + »)? – letronje

+3

urldecode() ou rawurldecode() – stillstanding

+0

@letronje: Vous devriez également encoder vos données en JavaScript pour éviter ces problèmes. jQuery peut gérer cela pour vous. SeniorDev posté comment faire cela. Le décodage côté serveur n'est pas nécessaire, puisque PHP gère cela pour vous. – jwueller

5

Utilisez

data: 'param='+encodeURIComponent('a+b+c') 

au lieu o f

data: 'param=a+b+c' 

et vous serez en mesure d'utiliser les données normalement sans décodage.