Construir consulta de acuerdo a CheckBox seleccionados PHP/MySQL

publicado por: Anonymous

Estoy intentando realizar una consulta de acuerdo a los checkbox que se hayan seleccionado pero no se me ocurre la mejor manera de hacerlo, quisiera que me ayudaran a construir el código.

Acá un ejemplo de cómo lo estoy haciendo

Vista del ejemplo

y si selecciono las tres últimas quedaría así..

Ejemplo con checks seleccionados

Como ven, si selecciono del segundo en adelante la concatenación empieza con OR y no se me ocurre como hacer para que si elijo sólo dos así sean los últimos, se genere sin iniciar con el OR.

Este es el código..

<?php 
error_reporting(error_reporting() & ~E_NOTICE);
$Negado = $_POST['Negado'];
$Aceptado = $_POST['Aceptado'];
$Rapido = $_POST['Rapido'];
$Desiste = $_POST['Desiste'];

$Consulta = "SELECT * FROM filtros WHERE ";

if ($Negado != "") {
    $Consulta.= " estado LIKE 'Negado' ";
} 
if ($Aceptado != "") {
    $Consulta.= " OR estado LIKE 'Aceptado' ";
} 
if ($Rapido != "") {
    $Consulta.= " OR estado LIKE 'Rapido'";
} 
if ($Desiste != "") {
    $Consulta.= " OR estado LIKE 'Desiste'";
}  
?>

<!DOCTYPE html>
<html>
<head>
    <title>Checks</title>
</head>
<body>
<form method="Post">
    <input type="checkbox" name="Negado" value="Negado">Negado
    <input type="checkbox" name="Aceptado" value="Aceptado">Aceptado
    <input type="checkbox" name="Rapido" value="Rapido">Rapido
    <input type="checkbox" name="Desiste" value="Desiste">Desiste
    <input type="submit" name="enviar" value="Enviar">
</form>
<br>
<?php echo "$Consulta"; ?>
</body>
</html>

Si existe alguna otra manera de hacer mejor esta consulta con los checks, estoy abierto a opciones.

Actualización..

He intentado agregando a la consulta raíz el código 1=1, y poniendo OR quedando del siguiente modo…

<?php 
error_reporting(error_reporting() & ~E_NOTICE);
$Negado = $_POST['Negado'];
$Aceptado = $_POST['Aceptado'];
$Rapido = $_POST['Rapido'];
$Desiste = $_POST['Desiste'];

$Consulta = "SELECT * FROM filtros WHERE 1=1 ";

if ($Negado != "") {
    $Consulta.= " OR estado LIKE 'Negado' ";
} 
if ($Aceptado != "") {
    $Consulta.= " OR estado LIKE 'Aceptado' ";
} 
if ($Rapido != "") {
    $Consulta.= " OR estado LIKE 'Rapido'";
} 
if ($Desiste != "") {
    $Consulta.= " OR estado LIKE 'Desiste'";
}  
?>

<!DOCTYPE html>
<html>
<head>
    <title>Checks</title>
</head>
<body>
<form method="Post">
    <input type="checkbox" name="Negado" value="Negado">Negado
    <input type="checkbox" name="Aceptado" value="Aceptado">Aceptado
    <input type="checkbox" name="Rapido" value="Rapido">Rapido
    <input type="checkbox" name="Desiste" value="Desiste">Desiste
    <input type="submit" name="enviar" value="Enviar">
</form>
<br>
<?php echo "$Consulta"; ?>
</body>
</html>

Pero con esa consulta me trae todos los registros de la tabla si selecciono uno o dos checkbox….

solución

Te sugiero que hagas lo siguiente, cambia los nombres de los checkbox y ponle estados[], de esta manera puedes obtener en el lado del servidor solo los que se hayan seleccionado y te evitas las condiciones if. Luego solo tienes que recorrer ese arreglo y si no es el ultimo elemento le agregas el OR al final del texto, sino, no lo pones; pk se sobre entiende que no viene mas ningun elemento detras.

Quedaria asi:

<?php
//valor inicial de la cadena Consulta
$Consulta = "SELECT * FROM filtros WHERE";
//Pregunto si ha sido enviado el formulario , en este caso si el arreglo POST presenta el indice enviar que no es mas que el nombre del botón del formulario
if(isset($_POST["enviar"])){
    //Mantengo esta línea que tenias
    error_reporting(error_reporting() & ~E_NOTICE);
    //Almaceno la longitud del arreglo para comparar posteriormente y para tomarlo como referencia en el ciclo for a continuación
    $length = count($_POST["estados"]); 
    //Recorro el arreglo pasado por el formulario con los valores de los checkbox que fueron marcados
    for($i=0;$i<$length;$i++){
        //Actualizo el valor de consulta para que vaya concatenando en cada iteración
        //Al final hago una condición que significa que si ha llegado al ultimo elemento del arreglo
        //No debe agregar nada despues del "like 'valor'", de lo contrario le anexa un 'OR'.
        $Consulta .= " estado LIKE '".$_POST["estados"][$i]."'".(($i == $length-1)?"":" OR");
    }
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Checks</title>
</head>
<body>
<form method="Post">
    <input type="checkbox" name="estados[]" value="Negado">Negado
    <input type="checkbox" name="estados[]" value="Aceptado">Aceptado
    <input type="checkbox" name="estados[]" value="Rapido">Rapido
    <input type="checkbox" name="estados[]" value="Desiste">Desiste
    <input type="submit" name="enviar" value="Enviar">
</form>
<br>
<?php echo $Consulta; ?>
</body>
</html>

Tambien puedes solucionarlo con una simple sentencia IN en SQL, así te evitas el recorrer el arreglo y el poner OR al final de cada iteración excepto en la última, para mi es la más sencilla y por lo menos devuelve el mismo resultado

Solo tienes que reemplazar:

   $length = count($_POST["estados"]); 
    for($i=0;$i<$length;$i++){            
        $Consulta .= " estado LIKE '".$_POST["estados"][$i]."'".(($i == $length-1)?"":" OR");
    }

POR

 $Consulta .= " estado IN ('".implode("','",$_POST["estados"])."')";    

A que te Fue más FACIL!!!!

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *