Variables booleanas publicadas a través de AJAX que se tratan como cadenas en el lado del servidor
-
01-10-2019 - |
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
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';
?>
- Envíe los datos de su JavaScript como JSON Stringified.
- 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.