Comunidad de diseño web y desarrollo en internet

Realizar multibúsquedas en nuestra base de datos con PHP

En este tip trataré de explicar como realizar una búsqueda dentro de nuestra base de datos, solo que para ello tendremos los campos tipo select cuyos nombres serán los siguientes:

Código :

dia, mes, ano, proveedor, obra, forpago


No pongo el formulario aquí por que pienso es algo extenso, el campo dia tendrá 31 valores que con un for podemos hacerlo de manera sencilla, el mes posee solamente 12 valores, el ano (año) tendría también algunos pocos valores dependiendo desde que año buscaremos dentro de algún registro sobre nuestra base de datos, proveedor (en mi caso) son empresas que venden materiales pero en tu caso podrían ser diversas, forpago representa la forma de pago que puede ser en cheque o vía efectivo, podrían agregar además la transferencia bancaria.

Bueno, al presionar el botón de búsqueda podría suceder que solo busquemos del año en curso y los demás campos quedaran como valores predeterminados, solamente que habría que evadir el problema que llega al hacer la consulta: aquí expongo el código.

Lee los comentarios. Ahí está en análisis del código.

Código :

<?php
// Incluimos nuestros datos de conexión a la base de datos
include_once("inc/conectar.php");
include_once("inc/functiones.php");

// Recibimos la fecha como día/mes/año y debemos separarlo
list($dia,$mel,$ano)=explode("/",$_GET['fecha']);
// Recibimos las demás variables vía GET
$obras=$_GET['obra'];
$proveedor=$_GET['proveedor'];
$forpago=$_GET['forpago'];

// Agregamos todas las variables en un array()
$a=array($dia,$mel,$ano,$obras,$proveedor,$forpago);

// Declaramos mis dos contadores que usare posteriormente
$concero=0;
$sincero=0;

// Ahora, dado que recibí el mes como una cifra de dos números debo convertirlos a su equivalente en letras
// i.e.: El mes 01 es enero, 03 es marzo, etc. Para ello declaro mi array que contiene el nombre de los meses para luego usarlo
$mes=array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");

// Declaramos también un arreglo bidimensional que luego usare
$j[][]=array();

// Identificamos cuales campos no han sido definidos
//porque como dije antes puede que solo busque con respecto a un mes y un año sin importar la forma de pago o el proveedor o podría suceder que sea una búsqueda especificada, osea con base a un día, un mes, un año, un proveedor, etc. Así es que con if nunca terminaríamos.
// Este for se encarga de buscar campo a campo si esta definido osea 6 veces lo hace para ello suso count()
// count($a) nos dice cuantas veces hará el for en este caso 6 porque $a es un array de 6 valores antes agregados.
for($e=0;$e<count($a);$e++)
{
// En mi formulario el valor de default osea si no eligen uno es 0 de ahí depende la búsqueda
// Si el valor de la variable es 0 contamos y vamos sumando los que tengan cero, así sabremos que campos 
// Fueron no seleccionados osea no les dieron importancia en la búsqueda
   if($a[$e]==0)
   {
      ++$concero;
      $j[0][$e]=False;
// $j[0][$e] esta variable nos dirá cual tendrá valor cero
   }
   else 
   {
      ++$sincero;
      $j[0][$e]=True;
// $j[0][$e] en esta variable nos dirá que campos si fueron definidos
   }
}

// sacamos los datos de la base de datos
$u=1;
$prove=array();
$consolta=mysql_query("SELECT nomempre FROM empresas");
   while($cell=mysql_fetch_array($consolta))
   {
   //paso los proveedores a un arreglo para tenerlos listos a mi busqueda
   $prove[$u]=$cell['nomempre']; $u++;
   }
                     
// En mi caso manejo estas tres obras así que son en las que me baso
$oobra[1]="Temixco";
$oobra[2]="Edificio";
$oobra[3]="Villas de Leyva";

// ...mis dos formas de pago
$pago[1]="Efectivo";
$pago[2]="Cheque";

// Aquí obtengo todos los campos de mi base de datos,
// Resultando mi consulta completa, es decir, que fueron declaradas todas las variables
$ejecuta="SELECT id,folio,nomempre,obra,formadepago,dia,mel,ano FROM facturas WHERE ";

// Variable auxiliar $contar
$contar=0;
if($concero<6){
   for($e=0;$e<count($a);$e++){
      if($j[0][$e]==False)
         ;      
      else
      {         
         if($e==0)
         { 
// Si estaba definido día hacemos esto
            $ejecuta .= "dia='".$a[$e]."'"; ++$contar;
// Si en cambio son mas de uno, los campos definidos agrego "AND" para indicar que hay otra variable
            if($contar<$sincero)
               $ejecuta.= " AND ";
         }
         else if($e==1)
         {
            $ejecuta .= "mel='".$mes[($a[$e] - 1)]."'"; ++$contar;
            if($contar<$sincero)
               $ejecuta.= " AND ";
         }
         else if($e==2)
         { 
            $ejecuta .= "ano='".$a[$e]."'"; ++$contar;
            if($contar<$sincero)
               $ejecuta.= " AND ";
         }
         else if($e==3)
         { 
            $ejecuta .= "obra='".$oobra[$a[$e]]."'"; ++$contar;
            if($contar<$sincero)
               $ejecuta.= " AND ";
         }
         else if($e==4)
         { 
            $ejecuta .= "nomempre='".$prove[$a[$e]]."'"; ++$contar;
            if($contar<$sincero)
               $ejecuta.= " AND ";
         }
// Llegamos al final, solo definimos nuestra ultima variable a buscar y ya no agregamos AND pues no hay mas campos
         else if($e==5)
            $ejecuta .= "formadepago='".$pago[$a[$e]]."'";
         
      }
   }
}

// En caso de que los 6 campos hayan sido definidos hacemos la consulta de default:
if($concero==6)       $ejecuta="SELECT id,folio,nomempre,obra,formadepago,dia,mel,ano FROM facturas";
$cons=mysql_query($ejecuta);
$contar=@mysql_num_rows($cons); 

// $contar nos dirá cuantos datos existen con esas características
if($contar>0){
 while($row=mysql_fetch_array($cons)): 
   echo ;
// Ya sabemos poner los datos obtenidos de nuestra consulta
 endwhile;

}
// En caso de no existir algún dato decimos que hay error
else echo "La factura especificada no existe, intente con otros datos";
?>

Espero quede bien entendido el código, que aunque extenso es completamente funcional. Además se que hay varias formas para hacer la misma búsqueda pero opté por esta ya que puede servirte al menos para comprender cómo crear tus propias funciones de búsqueda.

Pronto agregaré mas cosas, pero mientras tanto espero me comenten sus dudas.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate