2010-09-06 56 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

相關問題