Foros del Web » Programando para Internet » PHP »

Buscador avanzado en php

Estas en el tema de Buscador avanzado en php en el foro de PHP en Foros del Web. Hola amigos... En mi web que esta hecha en php tengo una especie de buscador para mi base de datos que es mysql... A ver, ...
  #1 (permalink)  
Antiguo 11/07/2003, 09:25
 
Fecha de Ingreso: junio-2003
Mensajes: 744
Antigüedad: 20 años, 9 meses
Puntos: 0
Buscador avanzado en php

Hola amigos...

En mi web que esta hecha en php tengo una especie de buscador para mi base de datos que es mysql...
A ver, lo que tengo hasta ahora es una especie de formulario que tiene diversos cuadros de texto y al lado de cada uno un checkbox, el funcionamiento es el siguiente tu marcas el checkbox o checkboxes por los cuales realizar la busqueda y la palabra a buscar de cada tipo que hallas marcado.. Me explico? El caso es que el resultado que me da es por cada check que he marcado, asi si pido buscar por nombre y apellidos me mostrará los resultados independientes, uno por coincidencias en nombre y otro por coincidencias en apellidos. Quiero mejorarlo y que me busque avanzanzado, osea si yo introduzco nombre y apellidos que me busque resultados cumpliendo los dos. La consulta mysql se hacerla lo que no se si con checkboxes en un formulario se puede mandar la consulta. He pensado en un for que recorra y guardarlo en un array (javascript) lo que luego como le digo que busque? Me podeis hechar una mano? MUCHAS GRACIAS...
HASTA PRONTO
  #2 (permalink)  
Antiguo 11/07/2003, 09:32
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 21 años, 1 mes
Puntos: 1
puedes unir lso valores de las dos variables antes de construir tu sentencia sql

Un Saludo
  #3 (permalink)  
Antiguo 11/07/2003, 09:35
 
Fecha de Ingreso: junio-2003
Mensajes: 744
Antigüedad: 20 años, 9 meses
Puntos: 0
En todo caso será separar valores, o no? pq si yo tengo nombre+apellido como realizo la consulta? pq la consulta se formula asi --> select * from tabla where nombre='$nombre' and apellidos='$apellidos' ¿no?
__________________
Ibisof | Saludos desde Eivissa !!! :p
  #4 (permalink)  
Antiguo 11/07/2003, 10:05
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 21 años, 1 mes
Puntos: 1
ok estas en lo correcto por que yo pensaba que tenias tanto los nombres como los apellidos en el mismo campo... entonces la sentencia que tu has hecho es correcta pero esa consulta buscara por ejemplo:

campo nombre--> antonio
campo apellidos--> perez martin

en tu sabe de datos imagina que solo tienes antonio perez asiq ue tu sentencia no te devolvera ningun registro para evitar esto puedes usar Like que lo que hace es igualar sino que contenga ese valor

Un Saludo
  #5 (permalink)  
Antiguo 11/07/2003, 10:06
Avatar de Sexma  
Fecha de Ingreso: junio-2003
Ubicación: Valencia
Mensajes: 109
Antigüedad: 20 años, 10 meses
Puntos: 0
Aqui tienes algo a ver si es lo que quieres, aunque revisalo que no lo he comprobado.

Código PHP:
$sql "SELECT * FROM tabla WHERE ";

if(isset(
$_POST['nombre'])) {
    
$sql .= "nombre = '".$_POST['nombre']." ' ";
    if(isset(
$_POST['apellidos'])){
        
$sql .= "AND apellidos= '".$_POST['apellidos']."'";
} elseif (isset(
$_POST['apellidos'])) {
    
$sql .= "apellidos= '".$_POST['apellidos']."'";

__________________
CLUB ESPORTIU UNIVERSITAT DE VALENCIA

Visita la pagina de la UV-O



  #6 (permalink)  
Antiguo 11/07/2003, 10:09
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 21 años, 1 mes
Puntos: 1
Sexma la verdad es que tu script esta muy bien pensado pero creoq eu deveria de usar like por loq ue comento arriba no estas deacuerdo conmigo?¿

Un Saludo
  #7 (permalink)  
Antiguo 11/07/2003, 14:40
Avatar de cofyman  
Fecha de Ingreso: noviembre-2002
Ubicación: Murcia - Spain
Mensajes: 17
Antigüedad: 21 años, 5 meses
Puntos: 0
Sonrisa Yo tengo algo, usalo si te vale :)

Bueno yo tengo un buscador "avanzado" que me curre hace tiempo para una web... te he sacado unas lineas (las mas importantes) y te las comento...
si no se entiende lo explico con mas detalles

Código PHP:
<?
$BgcolorHead        
"#91AAC1";        // Color de las cabeceras de las celdas 
$BgcolorHead2        "#93BEE2";
$BgcolorDatos        "#BECFDF";

//Recogemos los datos pasados por POST o GET
// la variable buscar nos dirá si hay que mostrar el formulario o ya podemos empezar la busqueda
$buscar     = (isset($_GET['buscar'])) ? $_GET['buscar'] : $_POST['buscar'];

//Recuperamos los datos personales
// Primero definamos con qué método se llamó    
$variables $_SERVER["REQUEST_METHOD"]=="GET"?$_GET:$_POST;

foreach(
$variables as $clave => $valor){
    if (
$valor!="") {    
        
//echo $clave."=".$valor."<br>";//El chivato que me dice si todo esta entrando bien        $array_consulta[$clave]=$valor;
    
}//end if
}//end foreach

//Con todas las lineas anteriores, que no son mias (no recuerdo ahora de quien, pero es idea de otro) consigo que no haga falta usar checkbox si hay cosas escribas me vale para la busqueda, si no paso
//Ahora miramos buscar para mostrar o no el formulario y en una sola página php lo hago todo
if (!$buscar) {
?>
<form name="f1" action="<? echo $_SERVER['PHP_SELF']?>" method="GET">
<table border="0" width="100%" cellpadding="0" cellspacing="0">
    <tr>
      <td valign="top">
        <table border="0" width="100%">
        <tr>
            <td colspan="2">
                <table border="0" width="100%" cellpadding="2" cellspacing="0">
                <tr bgcolor="<?= $BgcolorHead2 ?>">
                    <th align="center" valign="middle">Datos Personales</th>
                </tr>
                </table>
              </td>
        </tr>
        <tr>
            <td align="right" bgcolor="<?= $BgcolorHead ?>" width="25%"><b>NIF:</b></td>
            <td bgcolor="<?= $BgcolorDatos ?>">
            <input type="text" MAXLENGTH="10" SIZE="70" name="PER_NIF" onMouseOver="cambia(this,'Lavender');" onMouseOut="cambia(this,'ffffff');" onkeyup="this.value=comprobar(this)" value="<? echo $array_consulta['PER_NIF'?>">&nbsp;
              </td>
        </tr>
        <tr>
              <td align="right" bgcolor="<? echo $BgcolorHead ?>"><b>NOMBRE:</b></td>
            <td bgcolor="<?= $BgcolorDatos ?>"><input type="text" MAXLENGTH="100" SIZE="70" name="PER_NOMBRE" onMouseOver="cambia(this,'Lavender');" onMouseOut="cambia(this,'ffffff');" value="<? echo $array_consulta['PER_NOMBRE'?>">&nbsp;</td>
        </tr>
        <tr>
            <td align="right" bgcolor="<? echo $BgcolorHead ?>"><b>APELLIDOS:</b></td>
            <td bgcolor="<?= $BgcolorDatos ?>"><input type="text" MAXLENGTH="100" SIZE="70" name="PER_APELLIDOS" onMouseOver="cambia(this,'Lavender');" onMouseOut="cambia(this,'ffffff');" value="<? echo $array_consulta['PER_APELLIDOS'?>">&nbsp;</td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                &nbsp;<br>
                <input type="submit" value="&nbsp;&nbsp;Buscar  &raquo;" >
                <input type="hidden" name="buscar" value="1">
            </td>
        </tr>        
        </table>
        
      </td>      
    </tr>
</table>
</form>
<?
}else {
    
//Vamos a buscar, para ello comprobamos los datos pasados
    //------------------------------ N O M B R E ----------------
        //Comprobamos el nombre eliminando barras invertidas y dobles
        //y eliminamos los espacios del principio y del final y pasamos todo a mayusculas    
    
if ($array_consulta['PER_NOMBRE']) {
        
$array_consulta['PER_NOMBRE'] = strtoupper(trim(stripslashes($array_consulta['PER_NOMBRE'])));
        if (!
eregi("^[0-9A-Za-z*%ªº ]*$",$array_consulta['PER_NOMBRE'])){
            
$array_consulta['PER_NOMBRE']="*";            
        }
//end if
    
}//end if

    //Construimos la senctencia SQL de busqueda
    
$local_query1 "SELECT t1.*, t2.* FROM tbl_personas AS t1, tbl_socios AS t2 WHERE t1.PER_NIF = t2.SOC_NIF";
    
$local_query2 "";
    foreach(
$array_consulta as $clave => $valor){
        if (
strstr ($clave,"PER_")) {
            
$local_query2 .=" AND t1.".$clave." LIKE '".$valor."'";
        }elseif (
strstr ($clave,"SOC_")){
            
$local_query2 .=" AND t2.".$clave." LIKE '".$valor."'";
        }
//end if
    
}//end foreach        
    
    
$local_query2strtr($local_query2"*""%");//Cambiamos los * por %
    
$local_query2strtr($local_query2"?""_");//Cambiamos los ? por _
    
$local_query $local_query1.$local_query2;

?>
En este buscador se pueden usar el * y la ? como se usan en windows para las busquedas.

Que os parece??
  #8 (permalink)  
Antiguo 14/07/2003, 02:43
 
Fecha de Ingreso: junio-2003
Mensajes: 744
Antigüedad: 20 años, 9 meses
Puntos: 0
Que hago mal? me dice que tengo un fallo en el foreach... No hay manera no me sale Me ayudais por favor? Muchisimas gracias por todo !

if ($array_consulta['PER_interprete'])
{
$array_consulta['PER_interprete'] = strtoupper(trim(stripslashes($array_consulta['PER_interprete'])));
if (!eregi("^[0-9A-Za-z*%ªº ]*$",$array_consulta['PER_interprete']))
{
$array_consulta['PER_interprete']="*";
}
}

//Construimos la senctencia SQL de busqueda
$local_query = "SELECT * FROM $nomtabla WHERE";

foreach($array_consulta as $clave => $valor)
{
if (strstr ($clave,"PER_"))
{
$local_query .=" AND ".$clave." LIKE '".$valor."'";
}
}

echo "$local_query";
}
  #9 (permalink)  
Antiguo 14/07/2003, 07:24
Avatar de cofyman  
Fecha de Ingreso: noviembre-2002
Ubicación: Murcia - Spain
Mensajes: 17
Antigüedad: 21 años, 5 meses
Puntos: 0
Que error??

Te dice que tipo de error tiene en el foreach?

Por cierto que yo utilizaba lo de PER_ y lo de SOC_ por que tengo dos tablas, tbl_personas y tbl_socios donde los campos los llamo así: PER_ID, PER_NIF,... y en los socios: SOC_NIF, SOC_NUMERO,... pero que no es necesario para ti por lo que estoy viendo.

Podria ser que el $array_consulta esta vacio y por eso te da el error??

Dinos el error a ver que se puede hacer

Saludines
  #10 (permalink)  
Antiguo 14/07/2003, 08:06
 
Fecha de Ingreso: junio-2003
Mensajes: 744
Antigüedad: 20 años, 9 meses
Puntos: 0
Muchisimas gracias por todo, pero al final lo resolvi yo, lo hice de 0 pq estaba muy liada y al final salio bien.

HASTA PRONTO
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 05:23.