2010-09-06 7 views
25

que sigue es una parte de una funcionalidad AJAX para agregar clases y los paquetes de sesión de la compra: -variables booleanas publicado por AJAX se tratan como cadenas en el lado del servidor

El 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 de proceso de peticiones 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 
} 

Lo extraño

No importa si yo paso verdadero/falso (llamando addClassToCart() y addPackToCart()), siempre el código para añadir la clase a la sesión carrito ejecuta.
Si pongo declaraciones de eco no como esto: -

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

Ésta es la salida: -

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

Poner condiciones como este en el jQuery Sin embargo, el código funciona bien: -

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

Por último, si alterar el código del lado del servidor para esto: -

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

Estas son las salidas -

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

Así que, ¿por qué es el booleano variable tratada como una cadena aquí? ¿Estoy haciendo algo mal al publicar parámetros?

Gracias, Sandeepan

+4

Eso definitivamente no es * * inesperado. Todo lo que pasó a través de 'GET' o' POST' a PHP son cadenas. – NullUserException

+0

sí, ahora veo ... editado el título de mi pregunta –

Respuesta

41

No estás haciendo nada malo per se, es solo que cuando se publicó, se ve así:

operation=add_cart&isClass=true&itemId=1234 

PHP no puede decir lo que los datos tipo se debe a que no se pasa, siempre es sólo una cadena de datos POST, por lo que compararlo con "true" hacer sus cheques, así:

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

¿No hay otra alternativa? Prefiero hacer controles booleanos tanto como sea posible. –

+0

@sandeepan ¿Por qué? – NullUserException

+2

@sandeepan - no, no estoy seguro de qué más decir aparte de ... así es como funciona http y funciona http, es perfectamente normal. –

1
  1. Envía los datos de tu javascript como JSON en cadena.
  2. Realice una función PHP para convertir las cadenas 'verdadero' y 'falso' en valor booleano.

Personalmente me gusta el # 2, que va con la respuesta de Nick Craver.

+0

número 1 funciona mucho mejor cuando el objeto que desea guardar tiene varios niveles ... no se requieren funciones feos recursivas de php solo json_decode –

14

Esta es una vieja pregunta, pero me sorprende que nadie haya publicado esto aquí como solución.

Simplemente use 1 y 0 en lugar de verdadero y falso cuando esté construyendo sus solicitudes de AJAX. Cuando haga una comparación ==, se interpretarán como verdadero/falso.

JS:

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

PHP:

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

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

También se puede usar filter_var función con FILTER_VALIDATE_BOOLEAN filtro. Según la documentación php

Devuelve TRUE para "1", "verdadero", "encendido" y "sí". Devuelve FALSO de lo contrario. Si se establece FILTER_NULL_ON_FAILURE, FALSE se devuelve solo para "0", "falso", "apagado", "no" y "", y se devuelve NULL para todos los valores no booleanos.

Así recepción de parámetros de POST se verá así:

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

+1 para 'filter_var', una de las partes que a menudo se pasan por alto del PHP. – mcrumley

+1

Vine aquí para esto :) –

+4

¡Hermoso! La validación de un booleano como si fuera una cadena es feo y fubar. – Spock

Cuestiones relacionadas