Question

Voici une partie d'une fonctionnalité d'AJAX pour ajouter des classes et des packs à la session panier: -

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 partie de traitement de demande d'AJAX 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 si je passe vrai / faux (en appelant addClassToCart () et addPackToCart ()), toujours le code pour ajouter la classe à la session panier exécute.
Si je mets d'écho des déclarations là comme ceci: -

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

Ceci est la sortie: -

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

Mettre des conditions comme celui-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 est la variable booléenne traitée comme une chaîne ici? Ai-je fait quelque chose de mal dans les paramètres affichage?

Merci, Sandeepan

Était-ce utile?

La solution

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

operation=add_cart&isClass=true&itemId=1234

PHP ne peut pas dire ce que le type de données est parce qu'il est pas passé, il est toujours juste une chaîne de données POST, afin de le comparer "true" faire vos chèques, comme ceci:

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

Autres conseils

Vous pouvez également utiliser la fonction filter_var avec FILTER_VALIDATE_BOOLEAN filtre. Selon la documentation php it

  

Retourne TRUE pour "1", "true", "on" et "oui". Retourne FALSE sinon. Si FILTER_NULL_ON_FAILURE est défini, FALSE est retourné seulement pour « 0 », « faux », « off », « non », et « », et NULL est renvoyée pour toutes les valeurs non booléennes.

réception du paramètre POST ressemblera:

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

Ceci est un peu une vieille question, mais je suis surpris personne a publié ce billet ici comme solution.

Il suffit d'utiliser 1 et 0 au lieu de vrai et faux quand vous construisez vos demandes de ajax. Lorsque vous faites une comparaison de ==, ils seront interprétés comme vrai / faux.

JS:

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

PHP:

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

  echo $_GET['bar'] ? 'bar is true' : 'bar is false';
?>
  1. Envoyer les données de votre javascript comme JSON de chaîne de caractères.
  2. une fonction PHP pour convertir les chaînes de vrai »et « faux » à la valeur booléenne.

Personnellement, je aime # 2, qui va de pair avec la réponse de Nick Craver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top