Sei sulla pagina 1di 14

Manual de Php y MySql www.trujillohosting.

net

Ing. Carlos Urquizo Gmez Pgina 1

CREACION DE UN BUSCADOR
1. Como punto de partida, la informacin a buscar la tenemos que tener
almacenada en una tabla de nuestra base de datos. Como ejemplo estoy
usando la tabla alumnos de la Base de datos del Instituto, y tiene los
campos id, nombre y email.


Los tipos de los campos a buscar debern ser CHAR, VARCHAR o TEXT con
sus variantes.
2. Ahora disearemos una pgina con un formulario y una caja de texto para
escribir la cadena de consulta "bsqueda" y llamar al script de bsqueda
"buscar.php". Ejemplo:

<form name="form" action="buscar.php" method="post">
NOMBRE DEL ALUMNO<br />
<input type="text" size="20" name="t1" id="t1"><br />
<input type="submit" name="enviar" value="Buscar Alumno(a)">
<input type="reset" name="borrar" value="Borrar">
</form>


3. En el archivo buscar.php es donde est el click de la cuestin.
Hay que hacer la consulta que busque las palabras y devuelva como
resultado los registros coincidentes. Hasta aqu parece fcil y podramos
resolverlo as:

SELECT * FROM ALUMNOS WHERE NOMBRE LIKE '%$clave%' OR EMAIL
LIKE '%$clave%'

Pues esta consulta nos mostrar todos los alumnos que en su nombre o
email aparezca la clave de bsqueda tal y como nosotros la ingresamos.
Esto es muy limitado ya que un cambio en el orden de las palabras o un
cambio en el campo dar un error de bsqueda no mostrando los resultados
deseados.
Si bien podramos depurar y mejorar la sintaxis de nuestra bsqueda
utilizando el operador LIKE las bsquedas resultaran muy lentas y no
tendran el resultado esperado.
4. La solucin ms eficiente es utilizar los ndices FULLTEXT especficamente
indicados para este tipo de bsquedas. Pues bien esto implica ir a nuestra
base de datos, y crear un ndice FULLTEXT con todos los campos que
deseamos incluir en nuestra bsqueda, que en nuestro caso son NOMBRE y
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 2

EMAIL. Para ello basta con el phpmyadmin o bien escribir la instruccin
directamente:
ALTER TABLE ALUMNOS ADD FULLTEXT(NOMBRE);


5. Una vez creado el ndice la instruccin SQL para buscar ser:

SELECT * FROM ALUMNOS WHERE MATCH(NOMBRE) AGAINST('$clave')

Esta lnea utiliza la funcin MATCH ... AGAINST ... que encuentra el texto
buscado, usando consultas en lenguaje natural parecido a como lo hacen los
motores de bsqueda(google por ejemplo). Adems, se calcula
internamente una puntuacin en funcin de como aparecen los trminos
buscados dentro de nuestro tabla alumno.
6. Perfeccionando la bsqueda:

SELECT * , MATCH (NOMBRE,EMAIL) AGAINST ('$clave')
AS puntuacion FROM ALUMNOS WHERE MATCH (NOMBRE, EMAIL) AGAINST
('$clave') ORDER BY puntuacion DESC LIMIT 50

Esta lnea devuelve los 50 primeros resultados encontrados ordenados de
mas a menos puntuacin. El valor de la puntuacin es un nmero decimal
comprendido entre 0 y 1 por cada ocurrencia del patrn de bsqueda, que
se ir sumando si ese patrn es encontrado en varias ocasiones. De
cualquier forma esta puntuacin es un algoritmo interno de la base de datos.
7. Algunos problemas. Las bsquedas realizadas con MATCH ...AGAINST en
ocasiones fallan cuando el trmino a buscar contiene una sola palabra. Por el
contrario son unas bsquedas rapidsimas que producen mejores resultados
que otros mtodos ms rudimentarios como el LIKE cuando se trata de
varias palabras o frases.
8. La solucin que le he dado a ese problema de las bsquedas con
MATCH...AGAINST ha sido verificar el nmero de palabras a buscar,
utilizando una bsqueda simple con LIKE si se ingreso una sola palabra, y el
mtodo MATCH...AGAINST en el caso de varias palabras. Ejemplo del fichero
buscar.php

<?
if ($clave<>''){
//CUENTA EL NUMERO DE PALABRAS
$separa=explode(" ",$clave);
$numero=count($separa);
//echo $numero;
if ($numero==1) {
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 3

//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA
INSTRUCION CON LIKE
$rsalumno="SELECT nombre, email FROM alumnos WHERE nombre LIKE
'%$clave%' OR EMAIL LIKE '%$clave%'";
} elseif ($numero>1) {
//SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA
AVANZADO DE MATCH AGAINST
//busqueda de frases con ms de una palabra y un algoritmo
especializado
$rsalumnoc="select nombre, email, MATCH (nombre,email) AGAINST
('$clave') AS puntuacion from alumnos WHERE MATCH(nombre, email)
AGAINST ('$clave') ORDER BY puntuacion DESC";
}
}
$alumnoc = mysql_query($rsalumnoc); ///ejecuto la consulta
?>


CODIGO COMPLETO DE INDEX.PHP (BUSCADOR)
<html>
<head>
<title>Buscador - Formulario Inicial</title>
<SCRIPT LANGUAGE="JavaScript">
function quitaspacios(string) {
var makespacio = "";
string = '' + string;
splitstring = string.split(" ");
for(i = 0; i < splitstring.length; i++)
makespacio += splitstring[i];
return makespacio;
}
</script>
<script>
function validar(){
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 4

vdato = quitaspacios(this.form.t1.value)
if (vdato.length==0){
alert("Debe de ingresar el Nombre del Alumno que desea buscar.");
this.form.t1.select();
this.form.t1.focus();
return false}
}
</script>
<link rel="stylesheet" type="text/css" href="estilo.css">
</head>
<body topmargin="0" leftmargin="0">
<table border="0" cellpadding="0" cellspacing="0" width="750" align="left">
<tr>
<td colspan="3" background="../../img/fontop.gif">&nbsp;</td>
</tr>
<tr height="3"><td></td></tr>
<tr>
<td colspan="3"><script type="text/javascript" language="JavaScript1.2"
src="menucompu.js"></script></td>
</tr>
<tr>
<td width="505" valign="top">
<table cellpadding="5" cellspacing="0" width="100%" border="0">
<tr>
<td>
<table border="0" cellpadding="5" cellspacing="2"
width="100%" background="fondo1.gif">
<tr>
<td class="titulomenu"
colspan="2">INGRESE EL NOMBRE DEL ALUMNO A BUSCAR </td>
</tr>
<tr>
<td colspan="2" align="center">
<table cellpadding="0"
cellspacing="0" border="1" bordercolor="#0074B2">
<tr>
<td>
<form
name="form" action="detalumno.php" method="post" onSubmit="return validar();">
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 5


<table cellpadding="0" cellspacing="10" border="0">
<tr>
<td class="not">NOMBRE DEL ALUMNO</td>
<td><input type="text" size="20" name="t1" id="t1"></td>
</tr>
<tr valign="bottom" align="center">
<td colspan="2"><input type="submit" name="enviar" value="Buscar Alumno(a)">
<input type="reset" name="borrar" value="Borrar"></td>
</tr>
<tr>
<td align="center" colspan="2"><a href="listar.php" title="Mostrar todos los alumnos
de Computacin e Informtica" class="menuven">Listar Todos</a></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
</tr>
<tr height="5"><td></td></tr>
<tr height="1"><td bgcolor="#CCCCCC"
colspan="2"></td></tr>
<tr height="5"><td></td></tr>
</table> </td>
</tr>
</table> </td>
</tr>
</tr>
</table>
</body>
</html>

Cdigo Completo de detalumno.php (Resultado de la Bsqueda)
<? include('conexion.php');
$cn = Conectarse();
$clave=strtoupper($_POST["t1"]);

if ($clave<>''){
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 6

//CUENTA EL NUMERO DE PALABRAS
$separa=explode(" ",$clave);
$numero=count($separa);
//echo $numero;
if ($numero==1) {
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON
LIKE
$rsalumno="SELECT nombre, email FROM alumnos WHERE nombre LIKE '%$clave%'";
} elseif ($numero>1) {
//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
$rsalumno="select nombre, email, MATCH (nombre) AGAINST ('$clave') AS Score from alumnos
WHERE MATCH(nombre) AGAINST ('$clave') ORDER BY Score DESC";
}
}

$alumno = mysql_query($rsalumno); ///ejecuto la consulta like

?>
<html>
<head>
<title>Resultado de Busqueda por un Criterio</title>
<link rel="stylesheet" type="text/css" href="estilo.css">
</head>
<body topmargin="0" leftmargin="0">
<table border="0" cellpadding="0" cellspacing="0" width="750" align="left">
<tr>
<td colspan="3">&nbsp;</td>
</tr>
<tr height="3"><td></td></tr>
<tr>
<td colspan="3"><script type="text/javascript" language="JavaScript1.2"
src="menucompu.js"></script></td>
</tr>
<tr>
<td width="505" valign="top">
<table cellpadding="5" cellspacing="0" width="100%" border="0">
<tr>
<td>
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 7

<table border="0" cellpadding="5" cellspacing="2"
width="100%" background="fondo1.gif">
<tr>
<td class="titulomenu"
colspan="2">ALUMNOS - COMPUTACION </td>
</tr>
<tr>
<td width="58%"
class="tituloprofe">NOMBRE COMPLETO</td><td width="42%" class="tituloprofe">EMAIL</td>
</tr>
<?
while
($rsalumno=mysql_fetch_array($alumno)) {
?>
<tr>
<td class="pres"
bgcolor="#EBF0FF"><? echo eregi_replace("$clave","<i><b>$clave</b></i>", $rsalumno['nombre'])
?></td>
<td class="pres"
bgcolor="#EBF0FF"><? echo $rsalumno['email'] ?></td>
</tr>
<? } ?>
<tr height="5"><td></td></tr>
<tr height="1"><td bgcolor="#CCCCCC"
colspan="2"></td></tr>
<tr height="5"><td></td></tr>
<tr>
<td align="center" colspan="2"><a
href="index.php" title="Regresar a Pgina Principal" class="menuven">Inicio</a> | <a href="listar.php"
title="Listar todos los Alumnos de Computacin e Informtica" class="menuven">Listar
Todos</a>&nbsp; </td>
</tr>
</table> </td>
</tr>
</table> </td>
</tr>

<tr><td height="20" background="../../img/final.gif" class="copy" colspan="3">&nbsp;</td>
</tr>
</table>
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 8


</body>
</html>

IMPLEMENTANDO EL PAGINADOR PARA VER RESULTADOS DE LA BUSQUEDA TOTAL
Cuando se ejecuta la pgina listar.php se mostrarn todos los alumnos en su conjunto, lo cual es poco
esttico pues la pgina web crece demasiado hacia abajo.

En este caso se debe crear un Paginador. La funcin de un paginador es mostrar el resultado de una
consulta por partes, incluyendo en la parte inferior (o donde se desee) un listado de nmeros, las cuales
sern enlaces a los siguientes resultados de la consulta.

Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 9


Para desarrollar el paginador hacemos uso de un script llamado paginator.inc.php. Algunas de las
principales caracteristicas se muestran a continuacin.

Variables que se pueden definir antes de incluir el script va include():
$_pagi_sql OBLIGATORIA. Cadena. Debe contener una sentencia sql vlida (y sin la
clusula "limit").
$_pagi_cuantos OPCIONAL. Entero. Cantidad de registros que contendr como mximo
cada pgina. Por defecto est en 20.
$_pagi_nav_num_enlaces OPCIONAL Entero. Cantidad de enlaces a los nmeros
de pgina que se mostrarn como mximo en la barra de navegacin. Por defecto se muestran todos.
$_pagi_mostrar_errores OPCIONAL Booleano. Define si se muestran o no los errores de
MySQL que se puedan producir. Por defecto est en "true";
$_pagi_propagar OPCIONAL Array de cadenas. Contiene los nombres de las
variables que se quiere propagar por el url. Por defecto se propagarn todas las que ya vengan por el url
(GET).
$_pagi_conteo_alternativo OPCIONAL Booleano. Define si se utiliza
mysql_num_rows() (true) o COUNT(*) (false). Por defecto est en false.
$_pagi_separador OPCIONAL Cadena. Cadena que separa los enlaces numricos en
la barra de navegacin entre pginas. Por defecto se utiliza la cadena " | ".
$_pagi_nav_estilo OPCIONAL Cadena. Contiene el nombre del estilo CSS para los
enlaces de paginacin. Por defecto no se especifica estilo.
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 10

$_pagi_nav_anterior OPCIONAL Cadena. Contiene lo que debe ir en el enlace a la
pgina anterior. Puede ser un tag <img>. Por defecto se utiliza la cadena "&laquo; Anterior".
$_pagi_nav_siguiente OPCIONAL Cadena. Contiene lo que debe ir en el enlace a la
pgina siguiente. Puede ser un tag <img>. Por defecto se utiliza la cadena "Siguiente &raquo;"
$_pagi_nav_primera OPCIONAL Cadena. Contiene lo que debe ir en el enlace a la
primera pgina. Puede ser un tag <img>. Por defecto se utiliza la cadena "&laquo;&laquo; Primera".
$_pagi_nav_ultima OPCIONAL Cadena. Contiene lo que debe ir en el enlace a la
pgina siguiente. Puede ser un tag <img>. Por defecto se utiliza la cadena "&Uacute;ltima
&raquo;&raquo;"

LISTAR.PHP (Utiliza archivo paginator.inc.php)
<? include('conexion.php');
$cn = Conectarse();

//Sentencia sql (sin limit)
$_pagi_sql = "select * from alumnos order by nombre asc";
//cantidad de resultados por pgina (opcional, por defecto 20)
$_pagi_cuantos = 15;
//cantidad de enlaces que se mostrarn como mximo en la barra de navegacin
$_pagi_nav_num_enlaces = 3;//Elegir un nmero pequeo para que se note el resultado
//Decidimos si queremos que se muesten los errores de mysql
$_pagi_mostrar_errores = false;//recomendado true slo en tiempo de desarrollo.
//Si tenemos una consulta compleja que hace que el Paginator no funcione correctamente,
//realizamos el conteo alternativo.
$_pagi_conteo_alternativo = true;//recomendado false.
//Supongamos que slo nos interesa propagar estas dos variables
$_pagi_propagar = array("nombre","email");//No importa si son POST o GET
//Definimos qu estilo CSS se utilizar para los enlaces de paginacin.
//El estilo debe estar definido previamente
$_pagi_nav_estilo = "menuven";
//definimos qu ir en el enlace a la pgina anterior
$_pagi_nav_anterior = "&lt;";// podra ir un tag <img> o lo que sea
//definimos qu ir en el enlace a la pgina siguiente
$_pagi_nav_siguiente = "&gt;";// podra ir un tag <img> o lo que sea
include("paginator.inc.php");
?>

Donde se visualicen los datos se colocar:
<? while($row = mysql_fetch_array($_pagi_result)){ ?>
<? echo $row['nombre'] ?>
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 11

<? echo $row['email'] ?>
<? }
Este cdigo es para que se muestre la numeracin del paginador .
echo"<p>".$_pagi_navegacion."</p>";
?>


Cdigo Completo de la Pagina listar.php (Muestra el listado de alumnos paginados)
<? include('conexion.php');
$cn = Conectarse();

//Sentencia sql (sin limit)
$_pagi_sql = "select * from alumnos order by nombre asc";

//cantidad de resultados por pgina (opcional, por defecto 20)
$_pagi_cuantos = 10;
//cantidad de enlaces que se mostrarn como mximo en la barra de navegacin
$_pagi_nav_num_enlaces = 5;//Elegir un nmero pequeo para que se note el resultado
//Decidimos si queremos que se muesten los errores de mysql
$_pagi_mostrar_errores = false;//recomendado true slo en tiempo de desarrollo.
//Si tenemos una consulta compleja que hace que el Paginator no funcione correctamente,
//realizamos el conteo alternativo.
$_pagi_conteo_alternativo = true;//recomendado false.
//Supongamos que slo nos interesa propagar estas dos variables
Ojo Paginador
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 12

$_pagi_propagar = array("nombre","email");//No importa si son POST o GET
//Definimos qu estilo CSS se utilizar para los enlaces de paginacin.
//El estilo debe estar definido previamente
$_pagi_nav_estilo = "menuven";
//definimos qu ir en el enlace a la pgina anterior
$_pagi_nav_anterior = "&lt;";// podra ir un tag <img> o lo que sea
//definimos qu ir en el enlace a la pgina siguiente
$_pagi_nav_siguiente = "&gt;";// podra ir un tag <img> o lo que sea
include("paginator.inc.php");

?>
<html>
<head>
<title>Listado Completo de Alumnos</title>
<link rel="stylesheet" type="text/css" href="estilo.css">
</head>
<body topmargin="0" leftmargin="0">
<table border="0" cellpadding="0" cellspacing="0" width="750" align="left">
<tr>
<td colspan="3">&nbsp;</td>
</tr>
<tr height="3"><td></td></tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td width="505" valign="top">
<table cellpadding="5" cellspacing="0" width="100%" border="0">
<tr>
<td>
<table border="0" cellpadding="5" cellspacing="2"
width="100%" background="fondo1.gif">
<tr>
<td class="titulomenu"
colspan="2">LISTADO COMPLETO DE ALUMNOS </td>
</tr>
<tr>
<td width="58%"
class="tituloprofe">NOMBRE COMPLETO</td><td width="42%" class="tituloprofe">EMAIL</td>
</tr>
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 13

<? while($row =
mysql_fetch_array($_pagi_result)){ ?>
<tr>
<td class="pres"
bgcolor="#EBF0FF"><? echo $row['nombre'] ?></td>
<td class="pres"
bgcolor="#EBF0FF"><? echo $row['email'] ?></td>
</tr>
<tr><td align="center" colspan="2">
<? }
echo"<p>".$_pagi_navegacion."</p>";
?>
</td>
</tr>
<tr height="5"><td></td></tr>
<tr height="1"><td bgcolor="#CCCCCC"
colspan="2"></td></tr>
<tr height="5"><td></td></tr>
<tr>
<td align="center" colspan="2"><a
href="index.php" title="Regresar a Pgina Principal" class="menuven">Inicio</a>&nbsp;
</td>
</tr>
</table> </td>
</tr>
</table> </td>
</tr>

<tr><td height="20" background="../../img/final.gif" class="copy" colspan="3">&nbsp;</td>
</tr>
</table>

</body>
</html>
Manual de Php y MySql www.trujillohosting.net

Ing. Carlos Urquizo Gmez Pgina 14

PRACTICA CALIFICADA
Disear una Pagina para buscar temas de la Tabla Archivos, colocando un contador de Temas (Ver
Diseo), resaltando en negritas las palabras buscadas y paginando el resultado del listado total de
registros.
Diseo de Pagina index.php

Diseo de Pagina resultado.php

Diseo de Pagina listartodo.php


Una vez terminado esta Prctica agrega el Buscador y el Paginador al diseo de la Practica de la Semana
Pasada. Tanto al diseo del usuario como al Administrador.

Potrebbero piacerti anche