Ниже приведена часть функциональности AJAX для добавления классов и пакетов в сеансовую тележку:
Часть 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"); }
Запрос на обработку запроса 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 }
Странная вещь
Независимо от того, передаю ли я true / false (вызывая addClassToCart () и addPackToCart ()), всегда выполняется код для добавления класса в корзину сеанса.
Если я поставлю эхо-инструкции, вот так:
if($_POST['isClass']) { echo "see if condition ".$_POST['isClass']; } else { echo "see else condition ".$_POST['isClass']; }
Это результат: –
addClassToCart (), see if condition true
addPackToCart (), see if condition false
Включение таких условий в код jquery, однако, отлично работает:
function addItemToCart(itemId,isClass) { if(isClass) alert("is class"); else alert("is pack"); }
Наконец, если я изменю код на стороне сервера на это:
if($_POST['isClass'] === true) { echo "see if condition ".$_POST['isClass']; } else { echo "see else condition ".$_POST['isClass']; }
Это выходы –
addClassToCart () see else condition true
addPackToCart () see else condition false
Итак, почему булева переменная рассматривается как строка здесь? Я что-то делаю неправильно при публикации параметров?
Благодарю, Sandeepan
Вы не делаете ничего плохого как таковое, просто, когда он отправляется, это выглядит так:
operation=add_cart&isClass=true&itemId=1234
PHP не может сказать, что такое тип данных, потому что он не передан, это всегда просто строка данных POST, поэтому сравните его с "true"
чтобы выполнить свои проверки, например:
if($_POST['isClass'] === "true") { //Code to add class to session cart } else { //Code to add pack to session cart }
Также вы можете использовать функцию filter_var с фильтром FILTER_VALIDATE_BOOLEAN. Согласно документации php это
Возвращает TRUE для «1», «true», «on» и «yes». Возвращает FALSE в противном случае. Если FILTER_NULL_ON_FAILURE установлен, FALSE возвращается только для «0», «false», «off», «no» и «», а NULL возвращается для всех небулевых значений.
Таким образом, получение параметра POST будет выглядеть так:
$isClass = filter_var ($_POST['isClass'], FILTER_VALIDATE_BOOLEAN);
Это немного старый вопрос, но я удивлен, что никто не разместил это здесь как решение.
Просто используйте 1 и 0 вместо true и false, когда вы создаете свои запросы ajax. Когда вы выполните сравнение ==
, они будут интерпретироваться как истинные / ложные.
JS:
$.ajax({ url: '....', data: { foo: 1, bar: 0 } });
PHP:
<?php if ($_GET['foo']) { //... } else { //... } echo $_GET['bar'] ? 'bar is true' : 'bar is false'; ?>
Лично мне нравится # 2, что касается ответа Ника Крейвера.