логические переменные, отправленные через AJAX, обрабатываются как строки на стороне сервера

Ниже приведена часть функциональности 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'; ?> 
  1. Отправьте данные со своего javascript как сжатый JSON.
  2. Сделайте функцию PHP, чтобы преобразовать строки «true» и «false» в значение boolean.

Лично мне нравится # 2, что касается ответа Ника Крейвера.