2010-09-06 7 views
25

seguito è una parte di una funzionalità AJAX per aggiungere classi e impacchi alla sessione della spesa: -variabili booleane inviati tramite AJAX trattati come stringhe in lato server

jQuery parte

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"); 

} 

la parte AJAX richiesta di elaborazione 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 
} 

La cosa strana

Indipendentemente dal fatto che si passi vero/falso (chiamando addClassToCart() e addPackToCart()), viene sempre eseguito il codice per aggiungere la classe al carrello di sessione.
Se metto dichiarazioni di eco non in questo modo: -

if($_POST['isClass']) 
    { 
     echo "see if condition ".$_POST['isClass']; 
    } 
    else 
    { 
     echo "see else condition ".$_POST['isClass']; 
    } 

Questa è l'uscita: -

addClassToCart() see if condition true
addPackToCart() see if condition false

Mettendo condizioni come questo in jquery codice funziona comunque bene: -

function addItemToCart(itemId,isClass) 
{ 
    if(isClass) 
     alert("is class"); 
    else 
     alert("is pack"); 
} 

Infine, se mi modificare il codice lato server per questo: -

if($_POST['isClass'] === true) 
     { 
      echo "see if condition ".$_POST['isClass']; 
     } 
     else 
     { 
      echo "see else condition ".$_POST['isClass']; 
     } 

Queste sono le uscite -

addClassToCart() see else condition true
addPackToCart() see else condition false

Quindi, perché è il booleano variabile trattata come una stringa qui? Sto facendo qualcosa di sbagliato nella pubblicazione dei parametri?

Grazie, Sandeepan

+4

Che * non è sicuramente * inaspettato. Le cose passate tramite 'GET' o' POST' a PHP sono stringhe. – NullUserException

+0

sì, ora vedo ... modificato la mia domanda, titolo –

risposta

41

non si sta facendo nulla di male di per sé, è solo che quando viene pubblicato, sembra che questo:

operation=add_cart&isClass=true&itemId=1234 

PHP non può dire ciò che i dati tipo è perché non è passato, è sempre e solo una stringa di dati POST, quindi confrontarlo con "true" fare i vostri controlli, in questo modo:

if($_POST['isClass'] === "true") 
{ 
    //Code to add class to session cart 
} 
else 
{ 
    //Code to add pack to session cart 
} 
+0

Quindi non c'è altro modo per aggirare? Preferisco fare controlli booleani il più possibile. –

+0

@sandeepan Perché? – NullUserException

+2

@sandeepan - No, non so che altro dire altro che ... questo è il modo in cui i post e i post http funzionano, è perfettamente normale. –

1
  1. Invia i dati dal tuo javascript come JSON con stringhe.
  2. Creare una funzione PHP per convertire le stringhe 'true' e 'false' in valore booleano.

Personalmente mi piace # 2, che va con la risposta di Nick Craver.

+0

numero 1 funziona molto meglio quando l'oggetto che vuoi salvare è multilivello .. non sono necessarie brutte funzioni ricorsive di php solo json_decode –

14

Questa è una domanda un po 'vecchia, ma sono sorpreso che nessuno abbia pubblicato questo qui come soluzione.

Basta usare 1 e 0 invece di vero e falso quando si costruiscono le richieste Ajax. Quando si effettua un confronto con ==, verranno interpretati come veri/falsi.

JS:

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

PHP:

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

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

Inoltre è possibile utilizzare la funzione filter_var con filtro FILTER_VALIDATE_BOOLEAN. Secondo la documentazione php è

Restituisce VERO per "1", "vero", "on" e "sì". Restituisce FALSO in caso contrario. Se FILTER_NULL_ON_FAILURE è impostato, FALSE viene restituito solo per "0", "false", "off", "no" e "" e NULL viene restituito per tutti i valori non booleani.

Così ricezione dei parametri POST sarà simile:

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

+1 per 'filter_var', una delle parti spesso trascurate del PHP. – mcrumley

+1

Sono venuto qui per questo :) –

+4

Bello! Convalidare un booleano come se fosse una stringa è imho brutto e fubar. – Spock