Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/11/2011, 11:46
Avatar de Eleazan
Eleazan
 
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 18 años, 6 meses
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', $vEstado, 0);
    
$where = doWhere($where, 'osalida', $vOficina, 0);
    
$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', $vGrupo, 0); 
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_visitas, 1, '>=');
$restriccion = doWhere($restriccion, 'categoria', $buscar_categoria);
$restriccion = doWhere($restriccion, 'tamano', $buscar_tamano, 1, '>=');


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