Foros del Web » Programando para Internet » PHP »

Problemas Con Mi Primer Buscador

Estas en el tema de Problemas Con Mi Primer Buscador en el foro de PHP en Foros del Web. Hola, antes que nada gracias desde ya. Weno ahy va!!! He creado un buscador pa mi web y mas o menos funciona bien, el problema ...
  #1 (permalink)  
Antiguo 06/03/2003, 13:09
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años, 1 mes
Puntos: 2
Problemas Con Mi Primer Buscador

Hola, antes que nada gracias desde ya.

Weno ahy va!!!

He creado un buscador pa mi web y mas o menos funciona bien, el problema es que cuando meto mas de una palabra en el formulario para buscar, entonces no encuentra nada, me explico...
si por ejemplo meto tutoriales para buscar, encuentra el html de los tutoriales pero si meto tutoriales y manuales para buscar no encuentra nada, he utilizado un select y despues he sacado el valor del resultado con un mysql_fetch_array y un bucle while, por último he utilizado un mysql_num_rows para cuando no haya coincidencias en la búsqueda, a continuación pego el codigo que he utilizado, si alguien pudiese decirme la forma para que tambien encontrase resultados cuando la cadena a buscar consta de mas de una palabra le estaría eternamente agradecido xddd.

Me han comentado algo de utilizar tokens o full tex en la declaración de los campos de la tabla pero no he encontrado documentación al respecto o alguna web donde informarme sobre el tema, weno ya se acabo el rollo a continuación pego el codigo que he utilizado.

$resultado= mysql_query("SELECT Titulo, Descripcion, Url FROM $tabla WHERE (Titulo LIKE '%$buscar%' OR Descripcion LIKE '%$buscar%' OR Claves LIKE '%$buscar%') ORDER BY Titulo ", $conexion);


echo "<table width='90%'cellpadding='0' cellspacing='0' align=center bgcolor='#EFEFEF' border=0>";

while ($encontrados = mysql_fetch_array($resultado)){
echo "<tr><td height='20'>&nbsp;</td></tr>";
echo "<tr><td height='20' valign='middle' bgcolor='#003366'>&nbsp;<font face='arial' size='1'><strong><a href='".$encontrados['Url']."'>".$encontrados['Titulo']."</a></strong></font></td></tr>";
echo "<tr><td></td></tr>";
echo "<tr><td><font face='arial' size='1'><strong>".$encontrados['Descripcion'].".</strong></font></td></tr>";
echo "<tr><td><br></td></tr>";
}
echo "</table>";

if($vacio=mysql_num_rows($resultado)==0){
echo "<br><br><font face='arial' size='1'><strong>No se han encontrado coincidencias con la cadena <font color='#FF0000'>".$buscar."</font>.</strong></font>";
}


Saludos.
  #2 (permalink)  
Antiguo 06/03/2003, 13:21
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Código:
mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO articles VALUES
    -> (0,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
    -> (0,'How To Use MySQL Efficiently', 'After you went through a ...'),
    -> (0,'Optimising MySQL','In this tutorial we will show ...'),
    -> (0,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> (0,'MySQL vs. YourSQL', 'In the following database comparison ...'),
    -> (0,'MySQL Security', 'When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles
    ->          WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
__________________
Manoloweb
  #3 (permalink)  
Antiguo 06/03/2003, 13:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Eso que describes es completamente Normal .. Lo que tu indiques en tu campo a buscar va a ser textual como si de una frase completa se tratase:

Si quieres buscar "palabras" primero tendras que desglosar el "string" (cadena) que obtienes de tu formulario para poder hacer una consulta tipo

SELECT ... WHERE campo LIKE '%$palabras1$%' AND campo LIKE '%$palabras1$%' .. etc ..

Ahora, lo q tienes que hacer es esa consulta SQL de forma dinámica para que "formes" todos esos AND .. campo .. .. like .. AND .. campo like ... etc ..

Un saludo,
  #4 (permalink)  
Antiguo 06/03/2003, 13:48
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años, 1 mes
Puntos: 2
Cluster y como desgloso el contenido de la variable $buscar en palabras diferentes???

Un Saludo.
  #5 (permalink)  
Antiguo 06/03/2003, 14:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Manoloweb ...

Con dar el link completo a esa parte del manaul de Mysql .. tal vez leamos algo mas de teríra sobre ese ejemplo .. O mejor aun explicalo y aplicalo en un caso comun con PHP ..

Zertiko

Aquí te dejo un ejemplo .. el código está comentado .. si tienes dudas preguntalas.

Código PHP:
<?
// cadena con palabras ...
$buscar="hola cosa blabla";

// obtener el array de un string .. Usamos el espacio como separador o identenficador de palabras.
$array_palabras=explode(" ",$buscar);
//contar el total de "palabras" q tiene el string (el total de elementos del array)
$total_palabras=count($array_palabras)-1;

// se recorre el array generado por el explode ..
for ($indice=0$indice<=$total_palabras$indice++){
  
$secuencia_buscar="campo LIKE '%".$array_palabras[$indice]."%'";
  
// se mira si es la ultima palabra a poner . en tal caso no se pone el AND ..
  
if ($indice $total_palabras){
      
$condicion=" AND ";
  } else {
      
$condicion="";
  }
  
// se concatena (he de ahí el .= la secuencia anterior con el comando de la condicion ..
  
$secuencia_total .= $secuencia_buscar.$condicion;
}
// se concatena la secuencias de campo LIKE '%palabra%' AND .. con el SQL
// si hace falta mas parámetros o condiciones .. añadir al final ...
$sql "SELECT * FROM tabla WHERE ".$secuencia_total." ORDER BY campo";

echo 
$sql;
?>
Seguro que es mas rápido y mas optimo hacer consultas de este tipo en campos FULLTEXT .. pero ahí no me manejo a ese nivel con SQL .. si eso pregunta en el foro "Base de datos" o esperas a nuestro amigo manoloweb xDD

Un saludo,
  #6 (permalink)  
Antiguo 06/03/2003, 14:41
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años, 1 mes
Puntos: 2
Gracias Cluster me ha servido el ejemplo. ;)

Un saludo.
  #7 (permalink)  
Antiguo 06/03/2003, 16:15
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Bien... vale la reprimenda

A veces no se tiene todo el tiempo que uno quisiera, asi que a veces pongo solo una pista, y otras solo pego una pieza de codigo...

COMO FUNCIONA EL FULLTEXT??

(Requiere MySQL 3.23.23 o mayor)

1.- Defines tu tabla (articulos) con sus campos varchar y Text segun el contenido

Código:
CREATE TABLE `articulos` (
`ID` INT (5) UNSIGNED NOT NULL AUTO_INCREMENT, 
`autor` VARCHAR (255), 
`titulo` VARCHAR (255), 
`descripcion` TEXT, 
`fecha` DATE, 
PRIMARY KEY(`ID`)
)
2.- Defines los campos que se utilizarán para hacer busquedas "fulltext"

Código:
ALTER TABLE `articulos` ADD FULLTEXT buscar (descripcion,titulo)
3.- Llenas tu DB

INSERT INTO articulos (ID, autor, titulo, descripcion, fecha) VALUES (NULL, 'Manoloweb', 'Como hacer fulltext', 'La forma de hacer fulltext es la siguiente: se habe la tabla, bla bla...', '20030306')
INSERT INTO articulos (ID, autor, titulo, descripcion, fecha) VALUES (NULL, 'Dazuaga', 'Forma Correcta de postear respuestas', 'Para postear una respuesta de full text es necesario hacerlo bien...', '20030306')

4.- Haces tu busqueda como FullText


Código:
SELECT * FROM articulos WHERE MATCH (titulo,descripcion) AGAINST ('forma*');


Saludos!!
__________________
Manoloweb
  #8 (permalink)  
Antiguo 07/03/2003, 18:34
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años, 1 mes
Puntos: 2
Ok gracias Manoloweb ahora lo veo musho mas claro

Un saludo.
  #9 (permalink)  
Antiguo 09/03/2003, 08:41
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años, 1 mes
Puntos: 2
Hola Manoloweb:

Lo he hecho exactamente como tu me comentaste primero cree la tabla con este sql:

CREATE TABLE Buscadorbis (
ID INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
Titulo VARCHAR(200) NOT NULL,
Descripcion TEXT NOT NULL,
Claves VARCHAR(200) NOT NULL,
Url VARCHAR(200) NOT NULL,
PRIMARY KEY(ID)
);

ALTER TABLE Buscadorbis ADD FULLTEXT buscar (Titulo,Descripcion,Claves);

Despues la rellene de datos y seguidamente ejecuto esta sentencia:

$resultado= mysql_query("SELECT * FROM $tabla WHERE MATCH(Titulo,Descripcion,Claves) AGAINST ('$buscar') ORDER BY Titulo ", $conexion);

y sigue pasando lo mismo aveces funciona bien y otras falla...

Tengo la mysql 3.23.47 , pero lo estoy probando en modo local puede ser alguna confuración del server???

Un saludo.
  #10 (permalink)  
Antiguo 09/03/2003, 17:25
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Pero te da algun error o algo así?
__________________
Manoloweb
  #11 (permalink)  
Antiguo 09/03/2003, 17:52
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 15 años, 1 mes
Puntos: 2
Hola Manoloweb:

No me da error pero aveces no encuentra nada, por ejemplo si meto directiva encuentra varios registros pero alomejor meto junta directiva y no encuentra nada...

¿De que puede ser?


Un saludo.
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:39.