Foros del Web » Programando para Internet » PHP »

¿cómo restringir búsquedas?

Estas en el tema de ¿cómo restringir búsquedas? en el foro de PHP en Foros del Web. Tengo una base de datos MySQL con dos campos: Clave y Valor. El usuario consulta por clave y se le devuelve Valor, el código completo, ...
  #1 (permalink)  
Antiguo 14/10/2003, 01:02
 
Fecha de Ingreso: agosto-2003
Mensajes: 7
Antigüedad: 14 años, 4 meses
Puntos: 0
¿cómo restringir búsquedas?

Tengo una base de datos MySQL con dos campos: Clave y Valor. El usuario consulta por clave y se le devuelve Valor, el código completo, es este:

<?php

$hostname_global_con = "*******";

$database_global_con = "**";

$username_global_con = "*****";

$password_global_con = "******";

$global_con = mysql_connect($hostname_global_con, $username_global_con,

$password_global_con) or die(mysql_error());

mysql_select_db($database_global_con, $global_con);



//COMPRUEBO QUE SE HAYA ENVIADO EL FORMULARIO Y QUE EL CAMPO CLAVE TENGA ALGUN VALOR

if(isset($_POST['CLAVE']) && $_POST['CLAVE'] != ''){

//CREO LA CONSULTA, CON $_POST['tabla'] LE INDICO A QUE TABLA TIENE QUE HACER LA CONSULTA, EL VALOR VIENE DE UN CAMPO OCULTO

//QUE HAY EN CADA UNO DE LOS FORMULARIOS

$SQL = "SELECT * FROM ".$_POST['tabla']." WHERE clave LIKE '%".$_POST['CLAVE']."%'";

$result = mysql_query($SQL) or die (mysql_error.$SQL());

}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>www.lenguandina.org / Diccionario Aymara en línea</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>


<body bgcolor="#336699" text="#FFFFFF">
<div align="center">

<p>&nbsp;</p>
<p><font color="#333333" size="5" face="Courier New, Courier, mono"><strong><font color="#66CC33" size="6">www.lenguandina.org</font></strong></font></p>
<p><font color="#FFFFFF" face="Verdana, Arial, Helvetica, sans-serif">diccionario
Catellano Aymara / Aymara Castellano en l&iacute;nea</font></p>
<p><font color="#FFFFFF" face="Courier New, Courier, mono"><strong><font face="Verdana, Arial, Helvetica, sans-serif">[en
construcci&oacute;n]</font></strong></font></p>
<p>&nbsp;</p>

<table width="80%" border="2" cellpadding="0" cellspacing="0" bordercolor="#333333">
<tr>

<td width="50%" bgcolor="#336699">
<p align="center"><font color="#FFFFFF" size="2" face="Verdana, Arial, Helvetica, sans-serif">Castellano-Aymara</font></p>

<form name="form1" method="post" action="">
<font face="Verdana, Arial, Helvetica, sans-serif">
<input name="CLAVE" type="text" id="CLAVE">

<input name="consulta1" type="submit" id="consulta1" value="Consultar">

<input name="tabla" type="hidden" id="tabla" value="diccionario1">

</font>

</form>


</td>

<td width="50%"><p align="center"><font color="#FFFFFF" size="2" face="Verdana, Arial, Helvetica, sans-serif">Aymara-Castellano</font></p>

<form name="form2" method="post" action="">
<font face="Verdana, Arial, Helvetica, sans-serif">
<input name="CLAVE" type="text" id="CLAVE">

<input name="consulta2" type="submit" id="consulta2" value="Amajas&auml;si&ntilde;a">

<input name="tabla" type="hidden" id="tabla" value="diccionario2">

</font>

</form>


</td>

</tr>

<tr>

<td><div align="center">

<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Lista

de palabras castellanas disponibles</font></p>

<p><font face="Verdana, Arial, Helvetica, sans-serif">A B C D E F G

H I J K L M N &Ntilde; O P Q R S T U V W X Y Z</font></p>

</div></td>

<td><div align="center">

<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Lista

de palabras aymaras disponibles</font></p>

<p><font face="Verdana, Arial, Helvetica, sans-serif">A CH CHH CH' I

J K KH K' L LL M N &Ntilde; P PH P' Q QH Q' S T TH T' U W Y</font></p>

</div></td>

</tr>

</table>

<br>

<?php

//AQUI EMPIEZA EL BUSCADOR

if(isset($_POST['CLAVE']) && $_POST['CLAVE'] != ''){

//COMPRUEBO QUE HAYA ENCONTRADO ALGO, mysql_num_rows DEVUELVE EL NUMERO DE FILAS AFECTADAS POR LA CONSULTA

if(mysql_num_rows($result) > 0){

?>

<table width="80%" border="2" bordercolor="#333333">

<tr>

<td width="50%"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">RESULTADOS

DE BUSQUEDA</font></td>

<td width="50%"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">VALORES

ENCONTRADOS</font></td>

</tr>

<?php

//EMPIEZO A RECORRER LAS FILAS DEVUELTAS

while($row=mysql_fetch_assoc($result)){

?>

<tr>

<td><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><?php echo(str_replace($_POST['CLAVE'],'<B>'.$_POST['CLAVE'].'</B>',$row['CLAVE']))?></font></td>

<td><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><?php echo($row['VALOR'])?></font></td>

</tr>

<?php

//SOBRE str_replace, BUSCA UNA CADENA DE CARACTERES DENTRO DE OTRA Y LA SUSTITUYE POR UNA TERCERA, EL MECANISMO ES EL SIGUIENTE:

//str_replace ('cadena buscada', 'cadena_reemplazo', 'lugar en el que buscar')

}

?>

</table>

<?php

} else {

//ESTO ES POR SI NO ENCUENTRA NADA

echo('<font face="Verdana, Arial, Helvetica, sans-serif" size="2">NO SE HA ENCONTRADO NINGUNA COINCIDENCIA, POR FAVOR, VUELVA A INTENTARLO</font>');

}

//LIBERO MEMORIA

mysql_free_result($result);

}

//CIERRO LA CONEXION

mysql_close($global_con);

?>

</div>

</body>

</html>

Resulta que, en CLAVE no hay palabras, sino expresiones (pueden verlo en www.lenguandina.org) y cuando un usuario pone "de", no se le devuelven las entradas donde dice "venir 'de' lejos" o "subir 'de' a poco" sino tooooodas las entradas que tengan "de": "demonio, dedo, debajo, dejar" etc, lo que confunde a cualquiera. Mi pregunta es: qué modificaciones debo hacer, y dónde, para que busque por palabras completas, y no cuando la palabra buscada forme parte de otra, pero que eso no signifique que solo salgan las entradas con el texto exacto, ¿se entiende la pregunta?, que si alguien pone "de" salga efectivamente "venir 'de' lejos", pero no "demonio"... No sé mucho de esto, agradeceré cualquier ayuda.
  #2 (permalink)  
Antiguo 14/10/2003, 02:02
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Creo que usando el full text search de MySQL (http://www.mysql.com/doc/en/Fulltext_Search.html) solucionas eso. Pero entonces tendrias otro problema. Si pones 'canal' no te localizara 'canales'.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 14/10/2003, 07:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Lo que debes hacer es generar una sentencia SQL "dinámicamente" a partir de las palabras que pueda contener tu cadena de busqueda (frase)...

En general tendría que quedarte algo así:

SELECT * FROM tabla WHERE campo LIKE '$palabra1' AND campo LIKE '$palabra2' AND campo LIKE '$palabraN'

(con o sin "wildcars" (comodines) %...%)
Eso ya depende de si quiers que localice exactamente "nose de algo" .. o tambien: "nose demostracion algo"

Código PHP:
/*
IN:
$nombre .. Cadena de busqueda ..
$operador ... AND | OR
OUT
String .. SQL completo con bloques de "LIKE" ...
*/

function busqueda_xnombre_generaSQL($nombre,$operador){
    
    
// Obtenemos las palabras de la cadena de busqueda $nombre 
    // Se entiende como "palabra" a algo que le preceda un espacio.
    
$nombre_palabras=explode(" ",$nombre);

    
// Iniciamos la sentencia SQL .. (ojo con los espacios del final)
    
$sql="SELECT * FROM clientes ";
    
    
// Si la cadena de busqueda está vacia .. 
    
if (empty($nombre)){
      
$sql .=" ORDER BY nombre_cliente";
      return 
$sql;
    } else {
     
     
// Sino ... Empezamos a formar los grupos "LIKE" a base de las palabras que contiene la cadena de busqueda (explode() nos dió un array  ...)
    
$sql .=" WHERE ";
     
    
// Contamos las palabras y formamos un bucle .. Podría ser un for() en lugar de foreach() y el "if" ..    
    
$total_palabras=count($nombre_palabras);
    
$contador=0;
    foreach (
$nombre_palabras as $palabra){
        
// Se vá concatendo cada bloque "LIKE" generado .. Ojo con los espacios.
        
$sql_busqueda .=" nombre_cliente LIKE '%".$palabra."%' ";
        
        
// Se mira si estamos en el último elemento del array (en la última palabra de busqueda .. y si no es así .. concatena el Operador Lógico (puede ser AND u OR ..)
        
if ($total_palabras-$contador){
            
$sql_busqueda .= $operador;
        } 
         
// Se incrementa el contador (el for() lo haría igual ..)
        
$contador++;
    }
    
// Del SQL obtenido: SELECT * FROM tabla WHERE (boques LIKE) ... Le concatenamos el resto de opciones .. Ejemplo: ordenar por cierto campo ...    
   
$sql .=$sql_busqueda." ORDER BY nombre_cliente";
   
// Y .. se devuelve el SQL generado (cadena)
   
return $sql;
   }

La función es sólo para que te hagas una idea .. usa sus nombre de tus campos.

Su uso:

Código PHP:
mysql_query("busqueda_xnombre_generaSQL($frase_busqueda,'AND')"); 

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 14/10/2003 a las 07:09
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 10:03.