Php 通过AJAX发布的布尔变量在服务器端被视为字符串

Php 通过AJAX发布的布尔变量在服务器端被视为字符串,php,jquery,ajax,boolean,post-processing,Php,Jquery,Ajax,Boolean,Post Processing,以下是向会话购物车添加类和包的AJAX功能的一部分:- jquery部分 function addClassToCart(itemId) { addItemToCart(itemId,true); } function addPackToCart(itemId) { addItemToCart(itemId,false); } function addItemToCart(itemId,isClass) { $.post(url+"/ajax/add_cart",

以下是向会话购物车添加类和包的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()),始终会执行将类添加到会话购物车的代码。
如果我把echo语句放在那里,如下所示:-

    if($_POST['isClass'])
    {
      echo "see if condition ".$_POST['isClass'];
    }
    else
    {
      echo "see else condition ".$_POST['isClass'];
    }
这是输出:-

addClassToCart()
查看条件是否为真
addPackToCart()
查看条件是否为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()
请参见其他条件true

addPackToCart()
请参阅其他条件false

那么,为什么布尔变量在这里被视为字符串呢?我在发布参数时是否做错了什么

谢谢,
Sandepan

你本身并没有做错任何事情,只是当它被发布时,看起来是这样的:

operation=add_cart&isClass=true&itemId=1234
if($_POST['isClass'] === "true")
{
  //Code to add class to session cart
}
else
{
  //Code to add pack to session cart
}
PHP无法判断数据类型是什么,因为它没有被传递,它总是一个POST数据字符串,因此将其与
“true”
进行比较以进行检查,如下所示:

operation=add_cart&isClass=true&itemId=1234
if($_POST['isClass'] === "true")
{
  //Code to add class to session cart
}
else
{
  //Code to add pack to session cart
}
  • 将javascript中的数据作为字符串化JSON发送
  • 生成一个PHP函数,将字符串“true”和“false”转换为布尔值

  • 就我个人而言,我喜欢尼克·克雷弗的答案中的#2。

    这是一个有点老掉牙的问题,但我很惊讶没有人将此作为解决方案发布在这里

    在构造ajax请求时,只需使用1和0,而不是true和false。 当您进行
    ==
    比较时,它们将被解释为真/假

    JS:

    PHP:


    您还可以将filter\u var函数与filter\u VALIDATE\u BOOLEAN一起使用。根据php文档可以吗

    返回“1”、“TRUE”、“on”和“yes”的TRUE。否则返回FALSE。如果设置了FILTER\u NULL\u ON\u FAILURE,则仅对“0”、“FALSE”、“off”、“no”和“”返回FALSE,对所有非布尔值返回NULL

    因此,POST参数的接收将如下所示:

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

    这绝对不是意外。通过
    GET
    POST
    传递到PHP的所有内容都是字符串。。。编辑了我的问题标题,没有别的办法了吗?我更喜欢尽可能多地进行布尔检查。@Sandepan-不,不知道除了……这是http获取和发布的工作方式,这是完全正常的。为什么不改为使用“==”并让它为您进行类型转换?@Gary-因为它是一个字符串,“false”仍然是正确的,因为它是一个非零长度的字符串…请明确,您将不会感到意外。同样的规则也适用于JavaScript,例如,有些人从不使用
    ==
    ,只是出于充分的理由才使用
    ==
    。@r3wt您需要显式测试
    'true'
    'false'
    ,并将这些值重置为布尔值。转换为布尔值的字符串
    'false'
    将为true。查看查看PHP如何转换这些值。当要保存的对象是多级对象时,数字1的效果要好得多。。无需难看的递归php函数,只需json_decode+1即可用于
    过滤器_var
    ,这是php中经常被忽略的部分之一!像验证字符串一样验证布尔值是非常难看的。虽然我在前三个答案中投票,但这是一个非常干净和优雅的答案,它进入了我的代码。做得好。