web-dev-qa-db-fra.com

Variables booléennes publiées via AJAX étant traité comme des chaînes côté serveur

Ce qui suit fait partie d'une fonctionnalité AJAX pour ajouter des classes et des packs au panier de session: -

La partie jquery

function addClassToCart(itemId)
{
   addItemToCart(itemId,true);
}

function addPackToCart(itemId)
{
   addItemToCart(itemId,false);
}

function addItemToCart(itemId,isClass)
{   
     $.post(url+"/ajax/add_cart", { operation: 'add_cart','isClass':isClass, 'itemId': itemId},
        function(data)
        {
               if(data.success)
               {
                      alert("item added to cart");
               }
        }, "json");

}

La AJAX demande de traitement de la partie php -

//Checking operation and other posted parameters
if($_POST['isClass'])
{
  //Code to add class to session cart

}
else
{
  //Code to add pack to session cart
}

La chose étrange

Peu importe que je passe true/false (en appelant addClassToCart () et addPackToCart ()), toujours le code pour ajouter la classe au panier de session s'exécute.
Si je mets des déclarations d'écho comme ceci: -

    if($_POST['isClass'])
    {
      echo "see if condition ".$_POST['isClass'];
    }
    else
    {
      echo "see else condition ".$_POST['isClass'];
    }

C'est la sortie: -

addClassToCart () see if condition true
addPackToCart () see if condition false

Mettre des conditions comme celle-ci dans le code jquery fonctionne cependant bien: -

function addItemToCart(itemId,isClass)
 {  
     if(isClass)
        alert("is class");
     else
        alert("is pack");
 }

Enfin, si je modifie le code côté serveur à ceci: -

if($_POST['isClass'] === true)
        {
          echo "see if condition ".$_POST['isClass'];
        }
        else
        {
          echo "see else condition ".$_POST['isClass'];
        }

Ce sont les sorties -

addClassToCart () see else condition true
addPackToCart () see else condition false

Alors, pourquoi la variable booléenne est-elle traitée comme une chaîne ici? Suis-je en train de faire quelque chose de mal dans la publication des paramètres?

Merci, Sandeepan

36
Sandeepan Nath

Vous ne faites rien de mal en soi, c'est juste que quand il est publié, il ressemble à ceci:

operation=add_cart&isClass=true&itemId=1234

PHP ne peut pas dire quel est le type de données car il n'est pas transmis, c'est toujours juste une chaîne de données POST, alors comparez-la à "true" pour faire vos vérifications, comme ceci:

if($_POST['isClass'] === "true")
{
  //Code to add class to session cart
}
else
{
  //Code to add pack to session cart
}
50
Nick Craver

Vous pouvez également utiliser la fonction filter_var avec le filtre FILTER_VALIDATE_BOOLEAN. Selon la documentation php, il

Renvoie VRAI pour "1", "true", "on" et "yes". Renvoie FAUX sinon. Si FILTER_NULL_ON_FAILURE est défini, FALSE est renvoyé uniquement pour "0", "false", "off", "no" et "" et NULL est renvoyé pour toutes les valeurs non booléennes.

Ainsi, la réception du paramètre POST ressemblera à:

$isClass = filter_var ($_POST['isClass'], FILTER_VALIDATE_BOOLEAN);
73
Tamara

C'est un peu une vieille question, mais je suis surpris que personne ne l'ait signalé ici comme solution.

Utilisez simplement 1 et 0 au lieu de vrai et faux lorsque vous construisez vos requêtes ajax. Lorsque vous faites un == comparaison, ils seront interprétés comme vrais/faux.

JS:

$.ajax({
  url: '....',
  data: {
    foo: 1,
    bar: 0
  }
});

PHP:

<?php
  if ($_GET['foo']) {
     //...
  } else {
     //...
  }

  echo $_GET['bar'] ? 'bar is true' : 'bar is false';
?>
19
Sam Dufel
  1. Envoyez les données de votre javascript au format JSON stratifié.
  2. Créez une fonction PHP pour convertir les chaînes "true" et "false" en valeur booléenne.

Personnellement, j'aime le # 2, qui va avec la réponse de Nick Craver.

1
OIS