2010-09-06 81 views
25

以下是一个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()),始终将类添加到会话购物车的代码执行。
如果我把echo语句出现这样的: -

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

+4

这肯定是*不*意外。所有通过'GET'或'POST'传递给PHP都是字符串。 – NullUserException 2010-09-06 21:51:30

+0

是的,我现在看到...编辑我的问题标题 – 2010-09-06 21:57:40

回答

41

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

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 
} 
+0

那么没有其他方式?我更喜欢尽可能地进行布尔检查。 – 2010-09-06 21:56:12

+0

@sandeepan为什么? – NullUserException 2010-09-06 22:16:56

+2

@sandeepan - nope,不知道除了...之外还有什么要说的,这是http获取和发布的工作方式,这非常正常。 – 2010-09-06 22:25:47

1
  1. 将字符串JSON的JavaScript数据发送出去。
  2. 制作一个PHP函数将字符串'true'和'false'转换为布尔值。

我个人喜欢#2,这与Nick Craver的答案一致。

+0

当你想要保存的对象是多层次的时,数字1的工作效果会更好。没有丑陋的递归php函数只需要json_decode – 2013-12-16 10:56:24

14

这是一个老问题,但我很惊讶没有人在此发布此解决方案。

当您构建您的ajax请求时,只需使用1和0而不是true和false。 当你做一个==比较时,它们会被解释为真/假。

JS:

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

PHP:

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

    echo $_GET['bar'] ? 'bar is true' : 'bar is false'; 
?> 
58

您也可以使用filter_var函数过滤FILTER_VALIDATE_BOOLEAN。根据php的文档它

返回TRUE为“1”,“真”,“开”和“是”。否则返回FALSE。如果设置了FILTER_NULL_ON_FAILURE,则仅针对“0”,“false”,“off”,“no”和“”返回FALSE,并且对于所有非布尔值返回NULL。

所以接收POST参数看起来像:

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

对'filter_var'是+1,这是PHP经常被忽视的部分之一。 – mcrumley 2014-02-11 20:43:39

+1

来此:) – 2014-07-30 10:03:34

+4

美丽!验证一个布尔值就像是一个字符串是imho丑陋和fubar。 – Spock 2014-12-05 10:27:48

相关问题