Foros del Web » Programando para Internet » PHP »

Como hacer el siguiente buscador????

Estas en el tema de Como hacer el siguiente buscador???? en el foro de PHP en Foros del Web. Hola: Tengo la base de datos "principal": tabla clientes: Una serie de datos + categoria y subcategoria tabla categorias: id categoria tabla subcategorias: id categoria ...
  #1 (permalink)  
Antiguo 25/04/2005, 17:59
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
Como hacer el siguiente buscador????

Hola:

Tengo la base de datos "principal":
tabla clientes:
Una serie de datos + categoria y subcategoria

tabla categorias:
id
categoria

tabla subcategorias:
id
categoria
subcategoria


Necesito hacer un buscador asi:

*Un formulario que contenga un campo de texto para realizar la busqueda por nombre de la empresa (nombre alojado en la tabla clientes)
*Dentro del mismo formulario, un select que muestre las categorias (cargadas de la base de datos) y al escoger una, se genere otro select con las subcategorias.
***YA EL SELECT LO TENGO HECHO Y FUNCIONA GRACIAS A LAS FAQ DEL FORO***
*Por supuesto, el boton submit

La idea es que el visitante pueda realizar la busqueda TANTO POR NOMBRE COMO POR CATEGORIA Y SU RESPECTIVA SUBCATEGORIA, es decir, si introduce el nombre de la empresa, le arroja el resultado correspondiente a esa empresa con su direccion, telefonos, email, etc. (MOSTRAR LOS RESULTADOS LO SE HACER) y si por el contrario, no coloca el nombre de la empresa sino que prefiere buscar por categoria-subcategoria, entonces le arroja todas las empresas que esten incluidas en las respectivas categorias-subcategorias.

Se hacer el formulario, se mostrar los resultados... lo que no tengo claro es como hacer la consulta para generar esos resultados, es decir, consultar en cual o cuales tablas... estructurar el query mejor dicho.

Espero me puedan ayudar... Gracias
  #2 (permalink)  
Antiguo 25/04/2005, 18:05
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años
Puntos: 2
Creo que la cosa son tus tablas.

Para lo que tienes, tus tablas deberian ser como:

tabla categorias:
CategoriaID
CategoriaNombre

tabla subcategorias:
CategoriaID
SubCategoriaID
SubCategoriaNombre

Cluster index sobre CategoriaID, SubCategoriaID asc

Entonce en tu Query, todo es basado en la CategoriaID, algo como

select c.CategoriaID, c.CategoriaNombre, s.SubCategoriaID, s.SubCategoriaNombre
from categorias c
join subcategorias s on c.CategoriaID = s.CategoriaID

Creo que asi funcionaria, pero igual debes probar todo lo que se necesita.
  #3 (permalink)  
Antiguo 25/04/2005, 18:47
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
No lo tengo claro. Alguna otra sugerencia?
  #4 (permalink)  
Antiguo 25/04/2005, 19:10
Avatar de magoote  
Fecha de Ingreso: agosto-2004
Ubicación: Patagonia - Argentina
Mensajes: 187
Antigüedad: 19 años, 8 meses
Puntos: 0
Es medio un quilombo lo que decis, osea cuesta entenderlo pero aver si es lo que me parece, vos queres hacer distintas consultas, sobre una misma base de datos segun las opciones de un formulario. Bueno yo lo arme con varios string que contienen los fragmentos de las distintas consultas mysql, despues segun lo que te viene en el formulario, concatenas la consulta como corresponda, osea vas a tener varios select, segun opciones de busuqueda,varios where id=.... o where etc..etc
__________________
Desarrollo sitios web portales hosting Neuquen Argentina
• La imaginación es más importante que el conocimiento Albert Einstein (1879-1955)
  #5 (permalink)  
Antiguo 25/04/2005, 19:12
Avatar de magoote  
Fecha de Ingreso: agosto-2004
Ubicación: Patagonia - Argentina
Mensajes: 187
Antigüedad: 19 años, 8 meses
Puntos: 0
es en ASP pero es lo mismo

Código:
sbase="SELECT * from prt where "
sfin="order by nombre"
sloca=""
sespe=""

if request.QueryString("ipx")=2 then

	if request.QueryString("o")<>2 then
		snombre="nombre like '" & request.querystring("a") & "%' "
	else
		snombre="nombre like '%" & request.querystring("a") & "%' "
	end if

	if  request.querystring("l")<>"" then
		sloca="and localidad='" & request.querystring("l") & "' "
	end if
	
	if request.querystring("e")<>"" then
		sespe="and especialidad='" & request.querystring("e") & "' "
	end if
	a=request.querystring("a")
	o=request.QueryString("o")
	l=request.querystring("l")
	e=request.querystring("e")

else

	if request.Form("op")<>2 then
		snombre="nombre like '" & request.form("apellido") & "%' "
	else
		snombre="nombre like '%" & request.form("apellido") & "%' "
	end if
	a=request.form("apellido")
	o=request.Form("op")
	l=""
	e=""
	
		
	if  request.form("local")<>"0" then
		sloca="and localidad='" & request.form("local") & "' "
		l=request.form("local")
	end if
	
	if request.form("espe")<>"0" then
		sespe="and especialidad='" & request.form("espe") & "' "
		e=request.form("espe")
	end if

end if


	ssql=sbase + snombre + sloca + sespe + sfin
	
		rec.open ssql,Conn,3,1
__________________
Desarrollo sitios web portales hosting Neuquen Argentina
• La imaginación es más importante que el conocimiento Albert Einstein (1879-1955)
  #6 (permalink)  
Antiguo 25/04/2005, 19:23
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
uyyy... de casualidad me manejo con php. intentar con asp me queda cuesta arriba. gracias
  #7 (permalink)  
Antiguo 25/04/2005, 19:25
Avatar de magoote  
Fecha de Ingreso: agosto-2004
Ubicación: Patagonia - Argentina
Mensajes: 187
Antigüedad: 19 años, 8 meses
Puntos: 0
Pero fijate son todos IF y else, dale bola a eso, no al codigo..!!!!!
Es lo que vos necesitas?, a lo que me refiero?
__________________
Desarrollo sitios web portales hosting Neuquen Argentina
• La imaginación es más importante que el conocimiento Albert Einstein (1879-1955)
  #8 (permalink)  
Antiguo 25/04/2005, 19:59
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
es que no lo entiendo magoote. pareciera tener relacion, pero se me dificulta entender la nomenclatura.
  #9 (permalink)  
Antiguo 26/04/2005, 02:38
Avatar de Keleriano  
Fecha de Ingreso: junio-2002
Ubicación: Granada
Mensajes: 133
Antigüedad: 21 años, 9 meses
Puntos: 0
Lo unico que tu debes de hacer a la hora de buscar es darle preferencia a una búsqueda u otra.

Si no te he entendido mal lo que tu quieres hacer es buscar por categoría si el nombre está vacío sería algo así:

Código PHP:

if (!empty($_POST['nombre'])) {
  
$consulta "SELECT * FROM clientes WHERE nombre='".$_POST['nombre']."'";
}else if (!empty(
$_POST['categoria')) {
  
$consulta "SELECT * FROM clientes WHERE categoria='".$_POST['categoria']."'";
}

//Aquí realizariamos la consulta a la bd con mysql_query($consulta); 
  #10 (permalink)  
Antiguo 26/04/2005, 07:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Estaría bueno que se aclare que BD usas concretamente .. por qué aquí se han dado soluciones para MS SQL Server (o afines) .. para Mysql .. y realmente no sabemos todavia hacia donde vá el tema ..

Si lo que requieres es la consulta SQL adecuada .. lo mejor es que consultes en el foro de "Base de datos" .. pero eso sí, indicando que BD usas.

Un saludo,
  #11 (permalink)  
Antiguo 26/04/2005, 10:20
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
Gracias Kaleriano.... suena bien lo que propones. Voy a probar. Aunque alli seria la consulta "o nombre o categoria (con subcategoria), pero y si el usuario quiere buscar por ambas?, es decir, la empresa La Solución en la categoría Abogados y subcategoría Penal...
Cluster, trabajo con MySQL, pero cada vez que pongo un tema allí, no recibo respuesta, por ello y como tiene relación con PHP, prefiero ponerlo aquí.
  #12 (permalink)  
Antiguo 26/04/2005, 10:27
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
Por si las dudas, aclaro un poco mejor...

En la pagina principal se encuentra un pequeño form con una caja de texto para colocar un nombre de empresa a buscar, debajo, encontramos dos listas select, una creada por la otra, con las categorias y subcategorias (repito, ya estan hechas las select gracias a este mismo foro) y un boton de consultar (submit).

El usuario debe tener la posibilidad de buscar dentro del directorio asi:

*solo por el nombre de la empresa
*si no tiene el nombre, buscar por categoria y, si tiene, subcategoria
*buscar introduciendo el nombre de la empresa + la categoria y, si tiene, subcategoria

Al hacer la consulta, se despliega una pagina llamada resultados.php en la que se muestra a manera de listado la o las empresas resultantes con su nombre, debajo la direccion, los telefonos, etc (repito, esto tambien lo tengo resuelto hace bastante tiempo gracias a este mismo foro)

Lo que debo definir es como hacer la consulta correctamente teniendo en cuenta los criterios que puede tener el usuario al buscar.
  #13 (permalink)  
Antiguo 26/04/2005, 16:00
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Bueno .. en ese caso lo que requieres es "componer" tu sentencia SQL que en el fondo para PHP no es más que un "string" más cualquier (cadena) según tengas o no valores definidos en esas 3 variabels que manejas ..

algo tipo:
Código PHP:
$sql "SELECT * FROM tabla WHERE ";
if (!empty(
$_POST['nombre'])){
   
$sql .= " categoria = '".$_POST['categoria']."' ";


if (!
emtpy($_POST['categoria'])){
  
$sql .= " AND categoria = '".$_POST['categoria']."'";
}

$sql .= " ORDER BY talcampo";
// y ejecutas tu consulta...
mysql_query($sql); 
Y así con el resto .. es cosa de componer tu sentencia SQL como si de un string se tratase bajo tus condiciones de que tus variables tengan valor ... Imagina el sistema componiendo sentencias SQL para todos los casos ..

Un saludo,
  #14 (permalink)  
Antiguo 26/04/2005, 16:11
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años
Puntos: 2
Hola

En otra parte hicieron esto, mira esta liga, tal vez se parece a lo que necesitas:

http://www.forosdelweb.com/f21/consulta-para-mysql-boolean-complicada-291934/
  #15 (permalink)  
Antiguo 26/04/2005, 16:44
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
Gracias Neuron pero no me funciona... me da un error.

Pongo aqui el form a ver si se ve mejor la posibilidad:

inicio.php

Código PHP:
]<script language="javascript"> 
function recarga(){ 
window.location = "<?php echo $_SERVER['PHP_SELF']; ?>?var="+document.buscador.categoria.value; 
onChange="location.reload()"; 

</script>

<form name="buscador" id="buscador" method="post" action="resultados.php">
                      <table width="370" border="0" cellpadding="5">
                        <tr>
                          <td><div align="right">Ingrese el nombre a consultar </div></td>
                          <td><div align="right">
                            <input name="textfield" type="text" class="texto" size="30">
                          </div></td>
                        </tr>
                        <tr>
                          <td colspan="2"><div align="right">
<?php 
include("config.php"); 

$sql="SELECT categoria FROM categorias"
$result=mysql_db_query("bogonli_principal",$sql); 

echo 
'<select name="categoria" id="categoria"  class="texto" onChange="recarga()">'
$var=$_GET["var"]; 
while (
$row=mysql_fetch_array($result)) 
{echo 
'<option value="'.$row["categoria"].'"'
if(
$var==$row["categoria"]){echo " selected"; } 
echo 
'>'.$row["categoria"];} 
echo 
'</select>';

if(!empty(
$var)){ 
$var=$_GET["var"]; 
$sql2="SELECT subcategoria FROM categorias WHERE categoria='$var'"
$result2=mysql_db_query("bogonli_principal",$sql2); 
?>
&nbsp;&nbsp;
    <?
echo '<select name="subcategoria" id="subcategoria"  class="texto">'
while (
$row2=mysql_fetch_array($result2)) 
{echo 
'<option value="'.$row2["subcategoria"].'">'.$row2["subcategoria"];} 
echo 
'</select>'

?>
</div></td>
                        </tr>
                        <tr>
                          <td colspan="2"><div align="center">
                            <input name="submit" type="submit" class="texto" value="Realizar la consulta">
                          </div></td>
                        </tr>
                      </table>
                  </form
El form funciona perfecto, con su select que crea el otro y demas.

Lo que no doy es en query de la pagina de resultados, al hacer click en el boton voy a resultados.php pero siempre me arroja todo lo que hay.

Tengo un codigo que he venido usando desde hace tiempo y me funciona muy bien. Es resultado de algo de estudio y ayuda de este mismo foro. El problema es que es un buscador muy basico con paginacion incluida (tambien la requiero para este caso). Busca segun cualquier cosa que pongas en un solo campo de texto. Lo adapte para este caso pero siempre me arroja lo mismo, todo lo que hay. Ademas, no se como incluir los selct en el query

Lo pongo a ver si ayuda:

resultados.php

Código PHP:
<? 
   
include("config.php"); 
   
//$link=Conectarse(); 

//inicializo el criterio y recibo cualquier cadena que se desee buscar 
$criterio ""
$txt_criterio "";
if (isset(
$Buscacriterio)){
 
$txt_criterio=$Buscacriterio;
 
$criterio " where nombre like '%" $txt_criterio "%' or categoria like '%" $txt_criterio "%' or subcategoria like '%" $txt_criterio "%'"
}
 else{ 
if (
$_GET["criterio"]!=""){ 
   
$txt_criterio $_GET["criterio"]; 
   
$criterio " where nombre like '%" $txt_criterio "%' or categoria like '%" $txt_criterio "%' or subcategoria like '%" $txt_criterio "%'"
}
else
  if (
$_POST){ 
   
$txt_criterio $_POST["palabra"]; 
   
$criterio " where nombre like '%" $txt_criterio "%' or categoria like '%" $txt_criterio "%' or subcategoria like '%" $txt_criterio "%'"
   }
}
 
$sql="SELECT * FROM clientes".$criterio
$res=mysql_query($sql); 
$numeroRegistros=mysql_num_rows($res); 
if(
$numeroRegistros<=0

    echo 
"<div align='center'>"
    echo 
"<font face='arial' class='texto'>No se encontraron resultados</font>"
    echo 
"</div>"
}else{ 
    
//////////elementos para el orden 
    
if(!isset($orden)) 
    { 
       
$orden="nombre"
    } 
    
//////////fin elementos de orden 

    //////////calculo de elementos necesarios para paginacion 
    //tama&ntilde;o de la pagina 
    
$tamPag=5

    
//pagina actual si no esta definida y limites 
    
if(!isset($_GET["pagina"])) 
    { 
       
$pagina=1
       
$inicio=1
       
$final=$tamPag
    }else{ 
       
$pagina $_GET["pagina"]; 
    } 
    
//calculo del limite inferior 
    
$limitInf=($pagina-1)*$tamPag

    
//calculo del numero de paginas 
    
$numPags=ceil($numeroRegistros/$tamPag); 
    if(!isset(
$pagina)) 
    { 
       
$pagina=1
       
$inicio=1
       
$final=$tamPag
    }else{ 
       
$seccionActual=intval(($pagina-1)/$tamPag); 
       
$inicio=($seccionActual*$tamPag)+1
       if(
$pagina<$numPags
       { 
          
$final=$inicio+$tamPag-1
       }else{ 
          
$final=$numPags
       } 
       if (
$final>$numPags){ 
          
$final=$numPags
       } 
    } 
//////////fin de dicho calculo 

//////////creacion de la consulta con limites 
$sql="SELECT * FROM clientes ".$criterio." ORDER BY ".$orden.",nombre ASC LIMIT ".$limitInf.",".$tamPag
$res=mysql_query($sql); 
//////////fin consulta con limites 

/// estadisticas/////
echo "<div align='center'>"
echo 
"<font face='arial' class='texto'>Han sido encontrados ".$numeroRegistros." resultados<br>"
echo 
"Mostrando la p&aacute;gina " $pagina " de un total de " $numPags "<p>";
?>
                    <hr noshade style="color:#616161;height:1px">
                    <?
/// mostrar los resultados encontrados//////
while($registro=mysql_fetch_array($res)) 

echo 
"<div align='left'>";
echo 
"<b><a href=".$registro[url]."  target=_blank>".$registro[nombre]."</a></b><br>";
echo 
"".$registro[descripcion]."<br><br>";
echo 
"Direcci&oacute;n: ".$registro[direccion]."<br>";
echo 
"Tel&eacute;fonos: ".$registro[telefonos]."<br>";
echo 
"Correo electr&oacute;nico: <a href='mailto:".$registro[email_uno]."'>".$registro[email_uno]."</a>, ";
echo 
"<a href='mailto:".$registro[email_dos]."'>".$registro[email_dos]."</a><br>";
echo 
"Ubicaci&oacute;n: ".$registro[zona]."";
echo 
"<div align='right'>";
if (!empty(
$registro[capa])){
echo 
"<a href='detalles.php'  target=_blank>".$registro[capa]."</a><br>";
}
?>
                    <hr noshade style="color:#616161;height:1px">
                    <?
}//fin while     

//////////a partir de aqui viene la paginacion 
?>
                    <br>
                    <table border="0" cellspacing="0" cellpadding="0" align="center">
                      <tr>
                        <td align="center" valign="top" bgcolor="#FFFFFF">                    
                        <td><font size="1" color="#2278BB">
                          <? 
    
if($pagina>1
    { 
       echo 
"<a class='p' href='".$_SERVER["PHP_SELF"]."?pagina=".($pagina-1)."&orden=".$orden."&criterio=".$txt_criterio."'>"
       echo 
"<font face='arial' class='texto'>Anterior</font>"
       echo 
"</a> ";
    } 

    for(
$i=$inicio;$i<=$final;$i++) 
    { 
       if(
$i==$pagina
       { 
          echo 
"<font face='arial' class='texto'><b>".$i."</b> </font>"

       }else{ 
          echo 
"<a class='p' href='".$_SERVER["PHP_SELF"]."?pagina=".$i."&orden=".$orden."&criterio=".$txt_criterio."'>"
          echo 
"<font face='arial' class='texto'>".$i."</font></a> "
       } 
    } 
    if(
$pagina<$numPags
   { 
       echo 
" <a class='p' href='".$_SERVER["PHP_SELF"]."?pagina=".($pagina+1)."&orden=".$orden."&criterio=".$txt_criterio."'>"
       echo 
"<font face='arial' class='texto'>Siguiente</font></a>"
   } 
//////////fin de la paginacion 
?>
                          </font></td>
                      </tr>
                    </table>                    <hr noshade style="color:#616161;height:1px">
                    <div align="center"><font face="arial" class="texto"><a class="p" href="inicio.php">Buscar de nuevo</a></font></div>                    <? 
    mysql_close
(); 
?>
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 14:09.