php - parse - boolean traduccion
Las variables booleanas publicadas a través de AJAX se tratan como cadenas en el lado del servidor (4)
- Envía los datos de tu javascript como JSON stringificado.
- Haga una función de PHP para convertir las cadenas ''true'' y ''false'' a valor booleano.
Personalmente me gusta el # 2, que va con la respuesta de Nick Craver.
A continuación se incluye una parte de la 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 solicitud AJAX procesa parte 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 paso verdadero / falso (al llamar a addClassToCart () y addPackToCart ()), siempre se ejecuta el código para agregar la clase al carrito de la sesión.
Si pongo declaraciones de eco allí de esta manera: -
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 estas en el código jquery funciona bien:
function addItemToCart(itemId,isClass)
{
if(isClass)
alert("is class");
else
alert("is pack");
}
Finalmente, si modifico 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 es tratada como una cadena aquí? ¿Estoy haciendo algo mal en la publicación de parámetros?
Gracias sandeepan
Esta es una pregunta antigua, pero me sorprende que nadie haya publicado esto aquí como solución.
Solo use 1 y 0 en lugar de verdadero y falso cuando esté construyendo sus solicitudes ajax. Cuando haces 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'';
?>
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 saber cuál es el tipo de datos porque no se pasa, siempre es solo una cadena de datos POST, así que compárelo con "true"
para hacer sus verificaciones, como esto:
if($_POST[''isClass''] === "true")
{
//Code to add class to session cart
}
else
{
//Code to add pack to session cart
}
También puedes usar la función filter_var con el filtro FILTER_VALIDATE_BOOLEAN. Según la documentación de php
Devuelve VERDADERO para "1", "verdadero", "en" y "sí". Devuelve FALSE de lo contrario. Si se establece FILTER_NULL_ON_FAILURE, FALSE se devuelve solo para "0", "falso", "off", "no" y "", y se devuelve NULL para todos los valores no booleanos.
Así que la recepción del parámetro POST se verá así:
$isClass = filter_var ($_POST[''isClass''], FILTER_VALIDATE_BOOLEAN);