Buscador PHP

Estoy haciendo una pequeña web con PHP y mySQL y ahora me he metido a hacer un buscador BOOLEANO para ella. A la hora de hacerlo creé en las tablas de la base de datos unos índices FULLTEXT para que la sentencia SQL para la búsqueda sea:
SELECT * FROM tabla_bbdd WHERE MATCH(campoindice1,campoindice2) AGAINST ('$lo_que_busca_el_usuario IN BOOLEAN MODE')
Esa instrucción la empleo para todas las tablas, 5 en total. Mi problema es que puse unos if y elseif para que dependiendo de la sección escogida en el formulario de búsqueda y pasada GET por la URL, se buscase en una u otra tabla de la base de datos. Este problema es que sólo me realiza la búsqueda en la tabla que está en el primer if, tabla trucos, y en las otras pues no busca nada.
A continuación te remito el código para que veas lo que te digo, y para que me digas que errores hay, y además si tienes alguna opción para mejorar el código, me lo dijeses. Paso por URL las variables $seccion y $que, que es lo que se ha introducido en el campo de texto del formulario.
**********************************
formulario de búsqueda (index2.php)
<?php
$secciones['articulos'] = "Articulos";
$secciones['downloads'] = "Downloads";
$secciones['taller'] = "Taller";
$secciones['trucos'] = "Trucos S.O.";
$secciones['trucosjuegos'] = "Trucos Juegos";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form name="buscar" method="get" action="search2.php">
<p>Introduce el criterio de búsqueda <br>
<input type="text" name="que">
<input type="submit" name="buscar" value="Buscar">
</p>
<p>
<select name="seccion">
<option value=0>Todas la secciones</option>
<?php
foreach ($secciones as $key=>$value) {
echo "<option value=$key>$value</option>";
}
?>
</select>
</p>
</form>
</body>
</html>
************************************
página search2.php donde se realizan las búsquedas:
*************************************
<?php require_once('Connections/fullsearch.php'); ?>
<?php
$seccion = $HTTP_GET_VARS['seccion'];
$que = $HTTP_GET_VARS['que'];
if ($seccion='trucos')
{
mysql_select_db($database_fullsearch, $fullsearch);
$query_rsTrucos = "SELECT * FROM trucos WHERE MATCH(descripcion,contenido) AGAINST ('$que IN BOOLEAN MODE')";
$rsTrucos = mysql_query($query_rsTrucos, $fullsearch) or die(mysql_error());
$row_rsTrucos = mysql_fetch_assoc($rsTrucos);
$totalRows_rsTrucos = mysql_num_rows($rsTrucos);
}
elseif ($seccion='articulos')
{
mysql_select_db($database_fullsearch, $fullsearch);
$query_rsArticulos = "SELECT * FROM articulos WHERE MATCH(titulo,contenido) AGAINST ('$que IN BOOLEAN MODE')";
$rsArticulos = mysql_query($query_rsArticulos, $fullsearch) or die(mysql_error());
$row_rsArticulos = mysql_fetch_assoc($rsArticulos);
$totalRows_rsArticulos = mysql_num_rows($rsArticulos);
}
elseif ($seccion='downloads') {
mysql_select_db($database_fullsearch, $fullsearch);
$query_rsDownloads = "SELECT * FROM downloads WHERE MATCH(descripgr,descrippq,nombre) AGAINST ('$que IN BOOLEAN MODE')";
$rsDownloads = mysql_query($query_rsDownloads, $fullsearch) or die(mysql_error());
$row_rsDownloads = mysql_fetch_assoc($rsDownloads);
$totalRows_rsDownloads = mysql_num_rows($rsDownloads);
}
elseif ($seccion='taller') {
mysql_select_db($database_fullsearch, $fullsearch);
$query_rsTaller = "SELECT * FROM taller WHERE MATCH(titulo,contenido) AGAINST ('$que IN BOOLEAN MODE')";
$rsTaller = mysql_query($query_rsTaller, $fullsearch) or die(mysql_error());
$row_rsTaller = mysql_fetch_assoc($rsTaller);
$totalRows_rsTaller = mysql_num_rows($rsTaller);
}
elseif ($seccion='trucosjuegos') {
mysql_select_db($database_fullsearch, $fullsearch);
$query_rsJuegos = "SELECT * FROM trucosjuegos WHERE MATCH(titulo,contenido) AGAINST ('$que IN BOOLEAN MODE')";
$rsJuegos = mysql_query($query_rsJuegos, $fullsearch) or die(mysql_error());
$row_rsJuegos = mysql_fetch_assoc($rsJuegos);
$totalRows_rsJuegos = mysql_num_rows($rsJuegos);
}
?>
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.Estilo1 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
}
-->
</style>
</head>
<body>
<?php if ($totalRows_rsTrucos > 0) { // Show if recordset not empty ?>
<table width="452" border="0" cellspacing="1">
<tr>
<td colspan="2" class="Estilo1">Resultados de la búsqueda de <?php echo $que ?> en TRUCOS </td>
</tr>
<?php do { ?>
<tr>
<td class="Estilo1"><?php echo $row_rsTrucos['Descripcion']; ?></td>
<td class="Estilo1"><?php echo $row_rsTrucos['So']; ?></td>
</tr>
<?php } while ($row_rsTrucos = mysql_fetch_assoc($rsTrucos)); ?>
</table>
<hr>
<?php } // Show if recordset not empty ?>
<?php if ($totalRows_rsArticulos > 0) { // Show if recordset not empty ?>
<table width="452" border="0" cellspacing="1">
<tr>
<td colspan="2" class="Estilo1">Resultados de la búsqueda de <?php echo $que ?> en ARTÍCULOS </td>
</tr>
<?php do { ?>
<tr>
<td class="Estilo1"><?php echo $row_rsArticulos['Titulo']; ?></td>
<td class="Estilo1"><?php echo $row_rsArticulos['DescripPq']; ?></td>
</tr>
<?php } while ($row_rsArticulos = mysql_fetch_assoc($rsArticulos)); ?>
</table>
<hr>
<?php } // Show if recordset not empty ?>
<?php if ($totalRows_rsDownloads > 0) { // Show if recordset not empty ?>
<table width="452" border="0" cellspacing="1">
<tr>
<td colspan="2" class="Estilo1">Resultados de la búsqueda de <?php echo $que ?> en DOWNLOADS</td>
</tr>
<?php do { ?>
<tr>
<td class="Estilo1"><?php echo $row_rsDownloads['Nombre']; ?></td>
<td class="Estilo1"><?php echo $row_rsDownloads['DescripPq']; ?></td>
...
2

2 Respuestas

12.375 pts. Soy Programador-Analista
Lo primero. Ya había visto antes tú pregunta pero no pude responderla porque estaba menos especificada que esta. Ayer también iba a responderte pero al final no pude entre unas cosas y otras y bueno dejo de enrearme :P.
Si no has resuelto que no te haga siempre el primer if, sino me equivoco es que estás asignando en lugar de comparando en los if y else if(tienes que poner '=='). En cuanto a reducir el código podrías hacer lo siguiente:
**********************************
formulario de búsqueda (index2.php)
<?php
$secciones[0] = "tabla=trucos&campos=descripcion,contenido";
$secciones[1] = "tabla=articulos&campos=titulo,contenido";
$secciones[2] = "tabla=downloads&campos=descripgr,descrippq,nombre";
$secciones[3] = "tabla=taller&campos=titulo,contenido";
$secciones[4] = "tabla=trucosjuegos&campos=titulo,contenido";
?>
<select name="seccion">
<option value="<?=$secciones?>">Todas las secciones</option>
<option value="<?=$secciones[0]?>">Trucos S.O.</option>
<option value="<?=$secciones[1]?>">Artículos</option>
<option value="<?=$secciones[2]?>">Downloads</option>
<option value="<?=$secciones[3]?>">Taller</option>
<option value="<?=$secciones[4]?>">Trucos Juegos</option>
</select>
************************************
página search2.php donde se realizan las búsquedas:
*************************************
<?php require_once('Connections/fullsearch.php'); ?>
<?php
$seccion = $HTTP_GET_VARS['seccion'];
$que = $HTTP_GET_VARS['que'];
mysql_select_db($database_fullsearch, $fullsearch);
if (count($seccion)>1)
{
for($i=0;$i<5;$i++)
{
$valores = $seccion[$i];
parse_str($valores);
$query = "SELECT * FROM $tabla WHERE MATCH($campos) AGAINST ('$que IN BOOLEAN MODE')";
$rsResult[$i] = mysql_query($query, $fullsearch) or die(mysql_error());
$row_rsFilas[$i] = mysql_fetch_assoc($rsResult[$i]);
$totalRows_rsTotal[$i] = mysql_num_rows($rsResult[$i]);
}
}
else
{
$query = "SELECT * FROM $tabla WHERE MATCH($campos) AGAINST ('$que IN BOOLEAN MODE')";
$rsTabla = mysql_query($query, $fullsearch) or die(mysql_error());
$row_rsFilas = mysql_fetch_assoc($rsTabla);
$totalRows_rsTotal = mysql_num_rows($rsTabla);
}
En el primer if de la página search2 tienes la búsqueda en todas las tablas y el else es para el caso de una sola. Ahora sólo te queda readaptar el código html, según que sea uno u otro y en tendrás que poner otra serie de if o elses para saber de que tabla se trata, pero simplemente se tratará de saber eso y una vez hecho eso si tiene valor la búsqueda realizada.
591.125 pts. Licenciado en Informática
Lo primero es que en search2.php debes de tener cuidado con los elseif, pues en vez de comparar, asignas. Quiero decir, debes de poner dpble igualo, en vez de un solo igual:
elseif ($seccion='trucosjuegos') { --> elseif ($seccion=='trucosjuegos') {
Eso te pasa en las comparaciones, por eso siempre coge la primera.
Para buscar en todas las secciones a la vez, comprueba si el valor de la lista es "0", como tu lo tienes puesto, y en ese caso que salte los ifs. Lo puedes hacer con un if booleano tipo: if (x) AND (y) {-... etc...
Si todos los datos estuvieran en una tabla, sería más fácil, pero tal y como lo tienes, te da la opción de clasificar los resultados en función de donde vengan.
Perdona que no te optimice mucho, pero no tengo tiempo para mirarlo tan profundamente!.
Hola...
Gracias por la solución, pero te pido una pequeña aclaración por lo del if booleano. Me dices que es de tipo if (X) AND (y)... es que ya te digo que soy principiante en esto, por lo que no entiendo mucho. ¿Qué debería poner como x e y en el if? ¿Y para saltarme los ifs? Una vez me los salte... con que sería mejor hacer el buscador de todas las opciones, ¿con un for para que vaya pasando por todas?... toy algo perdido con esto.
Gracias por tu respuesta.
OK;
Para hacerlo fácil, deja ese bloque de querys como está, y si se selecciona "Buscar en todas", cuyo valor de variable es "0", tal y como tu has puesto, haces un IF inicial. Si es 0, que haga todos los querys, sino, que haga el bloque que ya tienes.
Solucionado.
Mejor hacer las búsquedas de forma independiente, si te das cuenta, cada tabla es de su padre y de su madre, no coinciden los campos, e imagino que tampoco el orden de los mismos, por lo que puede ser más complicado hacer un for que lo englobe todo.
No te preocupes por los muchos querys que tienes en la página, mysql se traga eso y más sin problemas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas