Foros del Web » Programando para Internet » PHP »

Buscar Palabra en un BD

Estas en el tema de Buscar Palabra en un BD en el foro de PHP en Foros del Web. sALUDOS He estado tratando de programar un buscador del cual si funciona bien pero solo me encuentra un resultado cuando en realidad hay muchos palabras ...
  #1 (permalink)  
Antiguo 15/01/2007, 22:59
 
Fecha de Ingreso: septiembre-2004
Ubicación: Lima
Mensajes: 141
Antigüedad: 19 años, 7 meses
Puntos: 0
Buscar Palabra en un BD

sALUDOS He estado tratando de programar un buscador del cual si funciona bien pero solo me encuentra un resultado cuando en realidad hay muchos palabras iguales en la base de datos , aca dejo el codigo , como podria hacr para que me salgan los demas resultados , gracias


<?php

// Busca la palabra

set_time_limit(0);

$database = 'jacky';
$word = 'Cesar';

echo "Search for word: <b>".$word."</b><br><br>";

$connect = mysql_connect('localhost','root','');
mysql_selectdb( $database, $connect );

$j=0;
$tables = mysql_list_tables( $database );

while( $line = mysql_fetch_row( $tables ) )
{
$fields = mysql_list_fields( $database, $line[0], $connect );
$columns = mysql_num_fields( $fields );

for ($i = 0; $i < $columns; $i++) {
$nomField = mysql_field_name( $fields, $i );
$sql = "SELECT ".$nomField." FROM " . $line[0] .
" WHERE " .
$nomField . " LIKE '%".$word."' LIMIT 1";

$query = mysql_query( $sql );
if( mysql_num_rows( $query ) > 0)
{
$result = mysql_fetch_array( $query );
echo "Table: <b>".$line[0]."</b><br>";
echo "Field: <b>".$nomField."</b><br>";
echo "SQL: <b>".$sql."</b><br>";
echo "Result: <b>" . str_replace( $word, "<font color='blue'>". $word . "</font>", $result[0] ) . "</b>";
echo "<br><br>";
$j++;
}
}
}
echo "<br><br><br>";
echo "Results: ".$j;

?>
__________________
"Es mejor arder del todo ke consumirse poco a poco"
  #2 (permalink)  
Antiguo 15/01/2007, 23:19
Avatar de Nefertiter  
Fecha de Ingreso: enero-2003
Ubicación: Rosario
Mensajes: 1.316
Antigüedad: 21 años, 3 meses
Puntos: 9
Re: Buscar Palabra en un BD

dame un ejemplo de los resultados q estan faltando... tu codigo asi no tienen ningun error...
  #3 (permalink)  
Antiguo 16/01/2007, 04:36
Avatar de holahola  
Fecha de Ingreso: mayo-2005
Ubicación: Móstoles - (Madrid)
Mensajes: 214
Antigüedad: 18 años, 11 meses
Puntos: 1
Re: Buscar Palabra en un BD

Cita:
Iniciado por Thetruejano Ver Mensaje
$sql = "SELECT ".$nomField." FROM " . $line[0] .
" WHERE " .
$nomField . " LIKE '%".$word."' LIMIT 1";
Quizás deberías quitar el LIMIT 1 de tu sentencia sql ¿no?.
  #4 (permalink)  
Antiguo 16/01/2007, 10:33
 
Fecha de Ingreso: septiembre-2004
Ubicación: Lima
Mensajes: 141
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Buscar Palabra en un BD

Saludos , Aun cambiando el limit a 2-3-4-5 o 10 solo encuentra un resultado ,

Repito Si funciona la busqueda , pero solo arroja un resultado , cual podria ser el problema
__________________
"Es mejor arder del todo ke consumirse poco a poco"
  #5 (permalink)  
Antiguo 16/01/2007, 19:40
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 225
Antigüedad: 17 años, 4 meses
Puntos: 1
Re: Buscar Palabra en un BD

podrias pasarme la estructura de la BD para testearlo
  #6 (permalink)  
Antiguo 16/01/2007, 23:19
 
Fecha de Ingreso: septiembre-2004
Ubicación: Lima
Mensajes: 141
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Buscar Palabra en un BD

Aca dejo la BD , por favor ojala me puedan dar una rspta o en todo caso otro ejemplo de busqueda , gracias

# phpMyAdmin SQL Dump
# version 2.5.7-pl1
# http://www.phpmyadmin.net
#
# Servidor: localhost
# Tiempo de generación: 17-01-2007 a las 00:17:11
# Versión del servidor: 5.0.16
# Versión de PHP: 4.4.1
#
# Base de datos : `jacky`
#

# --------------------------------------------------------

#
# Estructura de tabla para la tabla `demo4`
#

CREATE TABLE `demo4` (
`Contador` tinyint(8) unsigned zerofill NOT NULL auto_increment,
`DNI` char(8) NOT NULL,
`Nombre` varchar(20) NOT NULL,
`Apellido1` varchar(15) NOT NULL,
`Apellido2` varchar(15) NOT NULL,
`Nacimiento` date default '1970-12-21',
`Hora` time default '00:00:00',
`Sexo` enum('M','F') NOT NULL default 'M',
`Fumador` char(0) default NULL,
`Idiomas` set(' Castellano',' Francés','Inglés',' Alemán',' Búlgaro',' Chino') default NULL,
PRIMARY KEY (`DNI`),
KEY `auto` (`Contador`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ;

#
# Volcar la base de datos para la tabla `demo4`
#

INSERT INTO `demo4` VALUES (00000001, '1234', 'Lupicinio', 'Servidor', 'Servido', '1954-11-23', '16:24:52', 'M', NULL, ' Castellano, Francés');
INSERT INTO `demo4` VALUES (00000002, '97444947', 'Gonzalo', 'Barcena', 'de Grado', '1981-04-19', '08:16:42', 'M', '', '');
INSERT INTO `demo4` VALUES (00000003, '81185914', 'Fernando', 'Fernández', 'de las Asturias', '1975-05-03', '09:32:12', 'M', NULL, 'Inglés, Alemán, Chino');
INSERT INTO `demo4` VALUES (00000004, '32333046', 'Dorotea', 'García', 'del Rio', '1977-12-19', '03:30:36', 'F', NULL, ' Castellano, Francés, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000005, '63426349', 'Filiberto', 'Cano', 'de Loriana', '1976-12-10', '12:57:41', 'M', '', ' Castellano, Francés, Alemán, Búlgaro');
INSERT INTO `demo4` VALUES (00000006, '29567983', 'Ambrosio', 'Fernández', 'de Blimea', '1979-08-29', '06:11:07', 'M', '', ' Castellano, Chino');
INSERT INTO `demo4` VALUES (00000007, '98009643', 'Servanda', 'Alonso', 'de Loriana', '1982-03-23', '03:06:25', 'F', '', ' Castellano, Francés,Inglés, Chino');
INSERT INTO `demo4` VALUES (00000008, '5646882', 'Servanda', 'Alvarez', 'del Valle', '1980-06-19', '05:30:30', 'F', NULL, ' Castellano,Inglés, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000009, '64898799', 'Tiburcio', 'Iglesias', 'del Valle', '1975-01-25', '11:20:49', 'M', '', ' Castellano, Francés, Búlgaro');
INSERT INTO `demo4` VALUES (00000010, '67011965', 'Dorotea', 'Cano', 'del Rio', '1977-10-30', '06:56:32', 'F', '', ' Castellano,Inglés, Alemán, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000011, '19630781', 'Fernando', 'Alonso', 'de Aviles', '1983-12-28', '07:54:33', 'M', NULL, ' Francés,Inglés');
INSERT INTO `demo4` VALUES (00000012, '42183777', 'cesar', 'quintana', 'Sanchez', '1983-11-10', '11:55:51', 'M', '', ' Castellano,Inglés');
INSERT INTO `demo4` VALUES (00000013, '94431453', 'Lupicinia', 'López', 'del Valle', '1973-11-03', '04:49:09', 'F', '', ' Castellano,Inglés, Chino');
INSERT INTO `demo4` VALUES (00000014, '43594413', 'Lupicinia', 'Alonso', 'de Grado', '1981-09-03', '01:28:51', 'F', '', ' Castellano, Alemán, Búlgaro');
INSERT INTO `demo4` VALUES (00000015, '27408520', 'Filiberto', 'Cano', 'de Aviles', '1970-01-30', '06:19:58', 'M', '', ' Castellano, Francés, Búlgaro');
INSERT INTO `demo4` VALUES (00000016, '8857774', 'Dorotea', 'Alvarez', 'del Campo', '1983-12-16', '08:44:24', 'F', NULL, ' Castellano, Chino');
INSERT INTO `demo4` VALUES (00000017, '1958542', 'Gonzalo', 'Rodríguez', 'del Valle', '1979-06-11', '03:11:11', 'M', NULL, ' Castellano, Francés,Inglés, Alemán, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000018, '61794433', 'Tiburcio', 'Cano', 'de Aviles', '1982-06-14', '12:54:18', 'M', '', ' Francés,Inglés');
INSERT INTO `demo4` VALUES (00000019, '75635915', 'Fernando', 'García', 'del Monte', '1975-06-06', '03:26:40', 'M', '', ' Castellano,Inglés, Búlgaro');
INSERT INTO `demo4` VALUES (00000020, '51993535', 'Telesfora', 'Fernández', 'de Loriana', '1981-04-24', '04:37:10', 'F', '', ' Castellano, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000021, '17798930', 'Dorotea', 'Domínguez', 'de las Asturias', '1980-12-12', '02:32:50', 'F', '', ' Castellano, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000022, '40981023', 'Telesfora', 'Domínguez', 'de las Asturias', '1979-03-07', '06:30:15', 'F', '', ' Francés,Inglés, Alemán, Búlgaro, Chino');
INSERT INTO `demo4` VALUES (00000023, '', '', 'sds', '', '1901-01-01', '00:00:00', 'M', '', '');
__________________
"Es mejor arder del todo ke consumirse poco a poco"
  #7 (permalink)  
Antiguo 17/01/2007, 03:10
Avatar de holahola  
Fecha de Ingreso: mayo-2005
Ubicación: Móstoles - (Madrid)
Mensajes: 214
Antigüedad: 18 años, 11 meses
Puntos: 1
Re: Buscar Palabra en un BD

Creo que así funciona:

Código PHP:
<?php

// Busca la palabra

set_time_limit(0);

$database 'jacky';
$word 'Cesar';

echo 
"Search for word: <b>".$word."</b><br><br>";

$connect mysql_connect('localhost','root','');
mysql_selectdb$database$connect ); 

$j=0;
$tables mysql_list_tables$database );

while( 
$line mysql_fetch_row$tables ) )
{
$fields mysql_list_fields$database$line[0], $connect );
$columns mysql_num_fields$fields );

for (
$i 0$i $columns$i++) {
$nomField mysql_field_name$fields$i );
echo 
'Columna: '.$nomField.'<br>';
$sql "SELECT * FROM " $line[0] .
" WHERE " .
$nomField " LIKE '%".$word."%' ";

$query mysql_query$sql );
while(
$result mysql_fetch_array($query)) {
    echo 
"Table: <b>".$line[0]."</b><br>";
    echo 
"Field: <b>".$nomField."</b><br>";
    echo 
"SQL: <b>".$sql."</b><br>";
    echo 
"Result: <b>" str_replace$word"<font color='blue'>"$word "</font>"$result[$nomField] ) . "</b>";
    if (isset(
$result['Contador'])){
        echo 
" --->>> fila con identificador ".$result['Contador'];
    }
    echo 
"<br><br>";
    
$j++;
// fin del while $result
// fin del for
// fin del while $line

echo "<br><br><br>";
echo 
"Results: ".$j;

?>
Como lo has previsto para que se recorra todas las tablas de la base de datos, con los datos de la tabla que has dado he creado dos tablas con los mismos datos. Funciona.

Por supuesto, se ha eliminado el LIMIT 1 , y además se ha añadido un bucle while en lugar del if( mysql_num_rows( $query ) > 0) que tenías.

De todas formas, si lo que quieres es buscar palabras, te sugiero que el LIKE lo hagas con '%".$word."%' ; de esa forma cuando busques Valle te encontrará apellidos con del Valle. Por otro lado te va a encontrar por ejemplo del Vallecano. Todo depende de lo que te interese...

Me ha parecido interesante.

Un saludo.

PDT: Te he añadido la identificación de la fila encontrada. Según lo tienes, hay que hacerlo con el if (isset($result[Contador])) ya que si no se hace, daría error si tuvieras alguna tabla en la base de datos que no tenga campo Contador (supongo que para tí, Contador es el identificador de la fila).

Última edición por holahola; 17/01/2007 a las 05:58 Razón: POSTDATA
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:20.