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
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
}
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);
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';
?>
Personnellement, j'aime le # 2, qui va avec la réponse de Nick Craver.