Foros del Web » Programando para Internet » PHP »

Problema con un busacador php y mysql

Estas en el tema de Problema con un busacador php y mysql en el foro de PHP en Foros del Web. Hola tengo el siguiente problema: Al realizar una busqueda si solo introduzco una palabra funciona perfectamente pero al introducir dos me dice que no ha ...
  #1 (permalink)  
Antiguo 19/11/2009, 09:13
 
Fecha de Ingreso: noviembre-2009
Mensajes: 5
Antigüedad: 14 años, 5 meses
Puntos: 0
Problema con un busacador php y mysql

Hola tengo el siguiente problema: Al realizar una busqueda si solo introduzco una palabra funciona perfectamente pero al introducir dos me dice que no ha encontrado nada os paso el codigo a ver si me podeis ayudar:

este archivo es el buscador

<?php
$palabra_original = $_POST[palabra];
if ( isset($palabra_original) )
{
$palabra = htmlentities($palabra_original);

include('configuracion.php');
if (!$num) $num=0;
$cadenas_buscadas = explode(" ",$palabra);
$numero_de_cadenas = count($cadenas_buscadas);
if ( $numero_de_cadenas == 1 )
{
$sql="SELECT * FROM x
WHERE ( Nombre LIKE '%$palabra%'OR PrimerApellido LIKE '%$palabra%'OR SegundoApellido LIKE '%$palabra%'OR
DNI LIKE '%$palabra%'OR TelefonoFijo LIKE '%$palabra%'OR TelefonoMovil LIKE '%$palabra%'OR NumeroParcela LIKE '%$palabra%'
OR Residencial LIKE '%$palabra%'OR Direccion LIKE '%$palabra%'OR NumeroCuenta LIKE '%$palabra%'
)
ORDER BY Nombre
LIMIT ".$num.",10";

}
if ( $numero_de_cadenas > 1 )
{
$sql="SELECT distinct Nombre, PrimerApellido, SegundoApellido, DNI, TelefonoFijo, TelefonoMovil, NumeroParcela,
Residencial, Direccion, NumeroCuenta ,
MATCH ( Nombre, PrimerApellido, SegundoApellido, DNI, TelefonoFijo, TelefonoMovil, NumeroParcela, Residencial,
Direccion, NumeroCuenta )
AGAINST ( '%".$palabra."%' )
FROM x WHERE MATCH ( `Nombre`, `PrimerApellido`, `SegundoApellido`, `DNI`, `TelefonoFijo`, `TelefonoMovil`,
`NumeroParcela`, `Residencial`, `Direccion`, `NumeroCuenta`)
AGAINST ( '%".$palabra."%' )
ORDER BY Nombre
LIMT ".$num.",10";
}
$rs = $db->Execute($sql);
if ( !isset($rs) )
{
echo $db->ErrorMsg();
}
if ( $rs->fields["Nombre"] )
{
echo '<p>Texto ingresado: <b>'.$palabra_original.'</b></p>';
echo '<p>N&uacute;mero de palabras buscadas: <b>'.$numero_de_cadenas.'</b></p>';
echo '<table width=\"50%\">
<tr>
<th>#</td>
<th>T&iacute;tulo</td>
<th>Texto</td>
<tr>';
$contador = 0;
while (!$rs->EOF)
{
$contador++;
echo '<tr>';
echo "<td>".$contador."</td>";
echo "<td>".$rs->fields["Id"]."</td>";
echo "<td>".$rs->fields["Nombre"]."</td>";
echo "<td>".$rs->fields["Primer_Apellido"]."</td>";
echo "<td>".$rs->fields["Segundo_Apellido"]."</td>";
echo "<td>".$rs->fields["DNI"]."</td>";

echo '<tr>';
$rs->MoveNext();
}
}
else
{
echo 'No se han encontrado resultados correspondientes a su b&uacute;squeda.';
}

$rs_cont=$db->Execute("select found_rows() as total_filas");
if ($rs_cont->fields["total_filas"]>10)
{
for ($i=0; $i<$rs_cont->fields["total_filas"] && $i<50; $i=$i+10)
{
$a++;
echo '['.$a.'] ';
}
}
}
else
{
header('Location: index.php');
}
?>

este el es el formulario para pasarle la palabra/s a buscar:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

</head>
<body>
<form method="POST" action="buscador.php">
<label>Palabra a buscar:</label>
<input type="text" name="palabra" value="">
<input type="submit" value="Buscar">
</form>
</body>
</html>


y esta es la estructura de la base de datos.


CREATE TABLE IF NOT EXISTS `x` (
`Id` int(10) NOT NULL auto_increment,
`Nombre` varchar(50) NOT NULL,
`PrimerApellido` varchar(50) NOT NULL,
`SegundoApellido` varchar(50) NOT NULL,
`DNI` varchar(30) NOT NULL,
`TelefonoFijo` varchar(50) NOT NULL,
`TelefonoMovil` varchar(50) NOT NULL,
`NumeroParcela` varchar(50) NOT NULL,
`Residencial` varchar(50) NOT NULL,
`Direccion` varchar(50) NOT NULL,
`SegundaDireccion` varchar(50) NOT NULL,
`NumeroCuenta` varchar(50) NOT NULL,
PRIMARY KEY (`Id`),
KEY `titulo` (`Nombre`,`PrimerApellido`,`SegundoApellido`,`DNI` ,`TelefonoFijo`, `TelefonoMovil`
,`NumeroParcela`,`Residencial`,
`Direccion`,`NumeroCuenta`),
FULLTEXT KEY `titulo_2` ( `Nombre`, `PrimerApellido`, `SegundoApellido`, `DNI`, `TelefonoFijo`,
`TelefonoMovil`, `NumeroParcela`,
`Residencial`, `Direccion`, `NumeroCuenta`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


y estos los datos de prueba:

INSERT INTO `x` (`Id`, `Nombre`, `PrimerApellido`, `SegundoApellido`, `DNI`, `TelefonoFijo`, `TelefonoMovil`, `NumeroParcela`,
`Residencial`, `Direccion`, `SegundaDireccion`, `NumeroCuenta`)
VALUES
(1, 'Juan', 'lopez', 'Martinez', 'Antonio','1', 'Juan', 'lopez', 'Martinez', 'Antonio', 'Martinez', 'Antonio'),
(2, 'Mariano', 'lopez', 'Antonio', 'Juan','2', 'Mariano', 'lopez', 'Antonio', 'Juan', 'Martinez', 'Antonio'),
(3, 'pedro', 'mariano', 'alfonso', 'gines','3', 'pedro', 'mariano', 'alfonso', 'gines', 'Martinez', 'Antonio'),
(4, 'gines', 'mario', 'lopez', 'Antonio','3', 'pedro', 'mariano', 'alfonso', 'gines', 'Martinez', 'Antonio');

Gracias por todo
  #2 (permalink)  
Antiguo 19/11/2009, 09:25
Avatar de Fairy_Boy  
Fecha de Ingreso: octubre-2009
Ubicación: Kokiri Forest
Mensajes: 235
Antigüedad: 14 años, 6 meses
Puntos: 5
Respuesta: Problema con un busacador php y mysql

Hola.
una "sugerencia" es que al obtener la cadena a buscar, la trates para contar sus partes.
Código PHP:
<?php
$partes
=explode(" ",$cad_a_bus); 
$num=count($partes);
?>
luego, si tienes 1 palabra, utilizas 1 consulta y si son mas, utilizas otra.asi:
Código PHP:
<?php
if ($num==1){ 
        
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON LIKE 
        
$cadbusca=mysql_query("SELECT * FROM tu_tabla WHERE (id LIKE '%".$cad_a_bus."%') OR (campo_2 LIKE '%".$cad_a_bus."%') OR (campo_3 LIKE '%".$cad_a_bus."%')") or die("MySQL Error: ".mysql_error());
    }else{ 
        
//SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA AVANZADO DE MATCH AGAINST 
        //busqueda de frases con mas de una palabra y un algoritmo especializado 
        
$cadbusca=mysql_query("SELECT * FROM tu_tabla WHERE MATCH (campo_nombre_completo_ej) AGAINST ( '".$cad_a_bus."' IN BOOLEAN MODE ) ORDER BY campo_nombre_completo_ej DESC") or die("MySQL Error: ".mysql_error());
    }
?>
es un metodo sencillo, yo lo ocupo en una busqueda pequeña y funciona perfecto.
ojala sirva de algo
Saludos!
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 17:11.