Variables booleanas publicadas a través de AJAX que se tratan como cadenas en el lado del servidor

StackOverflow https://stackoverflow.com/questions/3654454

Pregunta

El siguiente es parte de una funcionalidad AJAX para agregar clases y paquetes al carrito de sesión:-

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

}

La parte de procesamiento de solicitudes de 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
}

La cosa extraña

No importa si paso verdadero/falso (llamando a addClasStOcart () y addPackToCart ()), siempre el código para agregar la clase a las ejecuciones de carrito de sesión.
Si pongo declaraciones de eco allí así:-

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

Esta es la salida:-

addClasStOcart () see if condition true
addPackTocart () see if condition false

Sin embargo, poner condiciones como esta en el código jQuery funciona bien:-

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

Finalmente, si altero el código del lado del servidor a 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

Entonces, ¿por qué la variable booleana se trata como una cadena aquí? ¿Estoy haciendo algo mal al publicar parámetros?

Gracias, Sandeepan

¿Fue útil?

Solución

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

operation=add_cart&isClass=true&itemId=1234

PHP no puede decir cuál es el tipo de datos porque no se pasa, siempre es solo una cadena de datos de publicación, así que compárelo con "true" Para hacer sus cheques, así:

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

Otros consejos

También puede usar la función filtre_var con filter_validate_boolean. Según la documentación de PHP,

Devuelve verdadero para "1", "Verdadero", "On" 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 nulo se devuelve para todos los valores no booleanos.

Por lo tanto, la recepción del parámetro post se verá como:

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

Esta es una pregunta un poco antigua, 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 AJAX. Cuando haces un == Comparación, serán interpretados como verdaderos/falsos.

JS:

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

PHP:

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

  echo $_GET['bar'] ? 'bar is true' : 'bar is false';
?>
  1. Envíe los datos de su JavaScript como JSON Stringified.
  2. Haga una función PHP para convertir las cadenas 'verdaderas' y 'falsas' al valor booleano.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top