Foros del Web » Programando para Internet » PHP »

Armar restriccion para consulta con GET del formulario

Estas en el tema de Armar restriccion para consulta con GET del formulario en el foro de PHP en Foros del Web. Hola, que tal? Hice una pagina en la que muestro fotos cargando la info de la base de datos, tambien he hecho un filtrado de ...
  #1 (permalink)  
Antiguo 20/11/2011, 21:35
Avatar de morfasto  
Fecha de Ingreso: julio-2011
Ubicación: Lima
Mensajes: 291
Antigüedad: 12 años, 9 meses
Puntos: 8
Armar restriccion para consulta con GET del formulario

Hola, que tal?

Hice una pagina en la que muestro fotos cargando la info de la base de datos, tambien he hecho un filtrado de informacion enviando un formulario via GET.

El problema es que creo que estoy haciendo algo mal ya que mi solucion para recoger la informacion del formulario y procesarla para armar la restriccion para hacer la consulta a la base de datos es demasiado larga, tal vez hay una manera mucho mas sencilla de hacerlo, pero no se me ocurre.

Queria saber si ustedes me podrian ayudar a hacerlo mucho mas sensillo.

Este es mi codigo:
Código PHP:
<?php
if(isset($_GET['titulo'])){
    
$buscar_titulo=$_GET['titulo'];
}else{
    
$buscar_titulo=NULL;
}
if(isset(
$_GET['autor'])){
    
$buscar_autor=$_GET['autor'];
}else{
    
$buscar_autor=NULL;
}
if(isset(
$_GET['formato'])){
    
$buscar_formato=$_GET['formato'];
}else{
    
$buscar_formato=NULL;
}
if(isset(
$_GET['visitas'])){
    
$buscar_visitas=$_GET['visitas'];
}else{
    
$buscar_visitas=NULL;
}
if(isset(
$_GET['categoria'])){
    
$buscar_categoria=$_GET['categoria'];
}else{
    
$buscar_categoria=NULL;
}
if(isset(
$_GET['tamano'])){
    
$buscar_tamano=$_GET['tamano'];
}else{
    
$buscar_tamano=NULL;
}
$restriccion="";
if(
$buscar_titulo!=NULL){
    
$restriccion=" titulo like '".$buscar_titulo."%'";
    if(
$buscar_autor!=NULL){
        
$restriccion=$restriccion." and autor = '".$buscar_autor."'";
        if(
$buscar_formato!=NULL){
            
$restriccion=$restriccion." and formato = '".$buscar_formato."'";
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }else{
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }
    }else{
        if(
$buscar_formato!=NULL){
            
$restriccion=$restriccion." and formato = '".$buscar_formato."'";
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }else{
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }
    }
}else{
    if(
$buscar_autor!=NULL){
        
$restriccion=" autor = '".$buscar_autor."'";
        if(
$buscar_formato!=NULL){
            
$restriccion=$restriccion." and formato = '".$buscar_formato."'";
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }else{
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }
    }else{
        if(
$buscar_formato!=NULL){
            
$restriccion=" formato = '".$buscar_formato."'";
            if(
$buscar_visitas!=NULL){
                
$restriccion=$restriccion." and visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }else{
            if(
$buscar_visitas!=NULL){
                
$restriccion=" visitas >= '".$buscar_visitas."'";
                if(
$buscar_categoria!=NULL){
                    
$restriccion=$restriccion." and categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }
            }else{
                if(
$buscar_categoria!=NULL){
                    
$restriccion=" categoria = '".$buscar_categoria."'";
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=$restriccion." and tamano >= '".$buscar_tamano."'";
                    }
                }else{
                    if(
$buscar_tamano!=NULL){
                        
$restriccion=" tamano >= '".$buscar_tamano."'";
                    }
                }
            }
        }
    }
}
if(!isset(
$_GET['resultados_pagina']))
{
    
$_GET['resultados_pagina']=10;
}
if(isset(
$_GET['pagina'])){
    
$pagina$_GET['pagina'];
}else{
    
$pagina=1;
}
$limite " LIMIT ".($pagina-1)*$_GET['resultados_pagina'].",".$_GET['resultados_pagina'];
$ruta "SELECT foto_id, tamano, categoria, visitas, autor, titulo, formato FROM fotos WHERE $restriccion ORDER BY fecha DESC $limite";
?>
Alguna idea?

Muchisimas gracias!
  #2 (permalink)  
Antiguo 21/11/2011, 11:30
Avatar de morfasto  
Fecha de Ingreso: julio-2011
Ubicación: Lima
Mensajes: 291
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Armar restriccion para consulta con GET del formulario

Si es que tengo mas campos en el form, mi codigo se duplica por cada campo.

Alguna idea?
  #3 (permalink)  
Antiguo 21/11/2011, 11:37
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Armar restriccion para consulta con GET del formulario

Yo tengo una pequeña funcion, del estilo

Código PHP:
function getGET($campo$pre 0) {
    if(isset(
$_GET[$campo])) return $_GET[$campo];
    else return 
$pre;

Así, puedes recoger los datos del estilo
Código PHP:
buscar_titulo getGET('titulo'NULL); 
Por ejemplo... así ahorras un par de lineas con el isset ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 21/11/2011, 11:46
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Armar restriccion para consulta con GET del formulario

Y para armar las consultas, te pego un trozo de mi código, q se entiende más o menos bien:
Código PHP:
    //Así armo la clausula where!
    
$where '';
    
//Creamos la consulta de búsqueda!
    
$where doWhere($where'estado'$vEstado0);
    
$where doWhere($where'osalida'$vOficina0);
    
$where doWhereLike($where'nombre+apellidos'$vConductor);
    
$where doWhereLike($where'localizador'$vLocalizador);
    
$where doWhereLike($where'nreserva'$vNreserva);
    
$where doWhere($where'fsalida'invertDate($vDesde), 1'>=');
    
$where doWhere($where'fsalida'invertDate($vHasta), 1'<=');
    
$where doWhere($where'id_grupo'$vGrupo0); 
Y las dos funciones que uso (invertDate sólo hace eso... invertir la fecha xD), son estas:
Código PHP:

function doWhere($where$campo$value$text 1$comp '=') {
    if(isset(
$where) && !empty($where)) {
        if(isset(
$value) && !empty($value)) {
            
$where .= ' AND ';
            if(
$text$where .= "`$campo`$comp'$value'";
            else 
$where .= "`$campo`$comp$value";
        }
        
    }
    else {
        if(isset(
$value) && !empty($value) ) {
            
$where 'WHERE ';
            if(
$text$where .= "`$campo`$comp'$value'";
            else 
$where .= "`$campo`$comp$value";
        }
    }
    
    return 
$where;
}

function 
doWhereLike($where$campo$value) {
   if(
strpos($campo'+')) {
       
$campos explode('+'$campo);
       
$campo " CONCAT(`".$campos[0]."`,' ',`".$campos[1]."`) ";
   }
    if(isset(
$where) && !empty($where) ) {
        if(isset(
$value) && !empty($value)) {
            
$where .= ' AND ';
            if(!isset(
$campos)) $where .= "`$campo` LIKE '%$value%'";
            else 
$where .= "$campo LIKE '%$value%'";
          
        }
        
    }
    else {
        if(isset(
$value) && !empty($value)) {
            
$where 'WHERE ';
            if(!isset(
$campos)) $where .= "`$campo` LIKE '%$value'%";
            else 
$where .= "$campo LIKE '%$value%'";
            
        }
    }
    
    return 
$where;


Básicamente, a explicar:
Ambas funciones añaden comparaciones (en caso de existir alguna previa) o arman la comparación a partir del $where q les pasas como parámetro.
$campo es el nombre del campo SQL
$value es el valor que le das
$text es 1 si es texto, 0 si es falso
$comp es el tipo de comparacion. Por defecto, es "=" (puedes poner >, <, <=, >=...)

Y en doWhereLike arma un Like para buscar coincidencias.
Automáticamente pone un % al principio y al final. Y para poner varios campos juntos (ej: nombre y apellidos) pondrías un 'nombre+apellidos' en el $campo.. con el + le indicas que son varios campos (de momento, sólo deja 2.. no he necesitado nunca más. Supongo que si algun dia necesito 3 lo adaptaré xD)

No sé si te servirá :)

Edit: La parte de validación es previa a este paso... eso corre a tu cuenta ;)


Edit 2:

He revisado tu código.. tenías los if's muy anidados, cosa innecesaria.

Podrías haber tenido algo así:
Código PHP:
//Para cada valor
if($buscar_autor != NULL) {
    if(!isset(
$restriccion)) $restriccion "`autor`='$buscar_autor' ";
    else 
$restriccion .= " AND `autor`='$buscar_autor' ";

Y así sólo habrias tenido 5 if's, ninguno anidado...

De todas formas, te adjunto lo q tenías hecho "pasado" con mis funciones ;)
Código PHP:
<?php 
$buscar_titulo 
getGET('titulo'NULL);
$buscar_autor  getGET('autor'NULL);
$buscar_formato getGET('formato'NULL);
$buscar_visitas getGET('visitas'NULL);
$buscar_categoria getGET('categoria'NULL);
$buscar_tamano getGET('tamano'NULL);


$restriccion=""

$restriccion doWhereLike($restriccion'titulo'$buscar_titulo);
$restriccion doWhere($restriccion,'autor'$buscar_autor);
$restriccion doWhere($restriccion'formato'$buscar_formato);
$restriccion doWhere($restriccion'visitas'$buscar_visitas1'>=');
$restriccion doWhere($restriccion'categoria'$buscar_categoria);
$restriccion doWhere($restriccion'tamano'$buscar_tamano1'>=');


if(!isset(
$_GET['resultados_pagina'])) 

    
$_GET['resultados_pagina']=10

if(isset(
$_GET['pagina'])){ 
    
$pagina$_GET['pagina']; 
}else{ 
    
$pagina=1

$limite " LIMIT ".($pagina-1)*$_GET['resultados_pagina'].",".$_GET['resultados_pagina']; 
$ruta "SELECT foto_id, tamano, categoria, visitas, autor, titulo, formato FROM fotos $restriccion ORDER BY fecha DESC $limite"
?>
Quedaría algo así :)

Un saludo!
__________________
>> Eleazan's Source
>> @Eleazan

Última edición por Eleazan; 21/11/2011 a las 12:00
  #5 (permalink)  
Antiguo 21/11/2011, 12:49
Avatar de morfasto  
Fecha de Ingreso: julio-2011
Ubicación: Lima
Mensajes: 291
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Armar restriccion para consulta con GET del formulario

Y si tengo varios OR:

consulta: SELECT foto_id FROM fotos WHERE categoria = 1 or categoria = 2 or categoria = 3 ORDER BY fecha DESC"

Esta consulta deberia de ser modificada para incluir parentesis:
consulta: SELECT foto_id FROM fotos WHERE (categoria = 1 or categoria = 2 or categoria = 3) ORDER BY fecha DESC"

Alguna recomendacion para añadir esos parentesis?
  #6 (permalink)  
Antiguo 21/11/2011, 12:56
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Armar restriccion para consulta con GET del formulario

Yo esq en una búsqueda, solo pongo "AND", nunca "OR"... no sé, suele ser en plan de "o buscas todas las categorias, o una en concreto"...

Pero supongo que podrías, o bien adaptar el doWhere.. o hacer un doWhereIn, o doWhereOr xD

o bien, añadir un simple
"`categoria` IN (1,2,3)"

Ya depende de lo q necesites :)
A la consulta.. no sé.
__________________
>> Eleazan's Source
>> @Eleazan
  #7 (permalink)  
Antiguo 21/11/2011, 13:19
Avatar de morfasto  
Fecha de Ingreso: julio-2011
Ubicación: Lima
Mensajes: 291
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Armar restriccion para consulta con GET del formulario

No sabia del IN(1,2,3) :), creo que con eso soluciono todo de una manera mas sencilla, gracias de nuevo! :)
  #8 (permalink)  
Antiguo 21/11/2011, 14:17
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años
Puntos: 322
Respuesta: Armar restriccion para consulta con GET del formulario

No es por nada pero.. Dios, es uno de los códigos mas largos que he visto para una tarea tan sencilla
Veo que te falta mucho por aprender del mundo del php, usaste opciones demasiado básicas y te olvidaste de lo demás que ayuda muchísimo: funciones, arrays, bucles, etcétera.
No estoy seguro que ésto sea lo que busques, pero a lo que entendí, ésto te debe funcionar como deseas:
Código PHP:
Ver original
  1. <?php
  2.  
  3. $vars = array('titulo', 'autor',' formato', 'visitas', 'categoria', 'tamano');
  4.  
  5. foreach($vars as $var) {
  6.     $var_var = "buscar_$var";
  7.     $$var_var = (isset($_GET[$var])) ? $_GET[$var] : null;
  8. }
  9.  
  10. if($buscar_titulo != null) {
  11.     $restriccion = " titulo like '$buscar_titulo%'";
  12. }elseif($buscar_autor != null) {
  13.     $restriccion = " autor = '$buscar_autor'";
  14. }
  15.  
  16. foreach($vars as $var) {
  17.     $varr = $_GET[$var];
  18.     $buscar_ = "buscar_$var";
  19.        
  20.     if($varr != null) {
  21.         if($var == 'visitas' || $var == 'tamano')
  22.             $restriccion .= " and $var >= '{$$buscar_}'";
  23.         else
  24.             $restriccion .= " and $var = '{$$buscar_}'";
  25.     }
  26. }

Si no funciona como quieres exactamente, te invito a modificar el código a tu gusto hasta que cumpla
con tus necesidades
Saludos
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies

Etiquetas: armar, formulario, restriccion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:02.