Php 通过AJAX发布的布尔变量在服务器端被视为字符串
以下是向会话购物车添加类和包的AJAX功能的一部分:- jquery部分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",
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中经常被忽略的部分之一!像验证字符串一样验证布尔值是非常难看的。虽然我在前三个答案中投票,但这是一个非常干净和优雅的答案,它进入了我的代码。做得好。