Foros del Web » Programando para Internet » PHP »

alluda a revisar un código mas o menos extenso please

Estas en el tema de alluda a revisar un código mas o menos extenso please en el foro de PHP en Foros del Web. Bueno, gracias por lka ayuda. Mi idea era hacer un buscador tipo google dentro de mis noticias, o sea uno ingresa una frase y mi ...
  #1 (permalink)  
Antiguo 19/07/2005, 09:32
Avatar de PabloP  
Fecha de Ingreso: marzo-2005
Mensajes: 83
Antigüedad: 19 años
Puntos: 0
alluda a revisar un código mas o menos extenso please

Bueno, gracias por lka ayuda. Mi idea era hacer un buscador tipo google dentro de mis noticias, o sea uno ingresa una frase y mi búsqueda encuentra todas las coincidencias con cada palabra de la frese sin repetir la noticia. Lo que primero hago es separar las palabras y eliminar los monosílabos como de, y, a, un por ejemplo y meter en un arreglo las palabras para luego realizar la busqueda, asigno a un nuevo arreglo cada id encontrado, lo limpio para eliminar los repetidos y luego hago un join al arreglo para utilizar este resultado en un sql con el IN o sea select * from tabla where id in arreglo. el problema es que al hacer el join, el sql considera todos los id como si fueran uno solo por lo que la búsqueda no encuentra resultado. Bueno eso, adjunto código, gracias.

Código PHP:
<?php 
$palabras 
$_POST['txtpal'];
$desglose explode(" "$palabras);

for (
$a=0;$a<count($desglose);$a++)
{
if ((
$desglose[$a] == "de") OR ($desglose[$a] == "a") OR ($desglose[$a] == "y") OR ($desglose[$a] == "la") OR ($desglose[$a] == "los") OR ($desglose[$a] == "las") OR ($desglose[$a] == "el") OR ($desglose[$a] == "un") OR ($desglose[$a] == "unas") OR ($desglose[$a] == "unos"))
{
$desglose[$a] = "cadena-de-palabras-prohibidas"//esto es para que no de problemas si la búsqueda comienza o termina con un monosilabo.
}
else
{
$desglose[$a] = $desglose[$a];
}
}

$limpieza_array array_unique($desglose);

$cantidad 0;
for (
$b=0;$b<count($limpieza_array);$b++)
{
$cantidad++;
}
///////////////////////////////////////////////////////////////////////
if ($_POST['boton']=='avanzada')
{
$d 0;
for (
$c=0;$c<$cantidad;$c++)
{
mysql_select_db($database_conexportal$conexportal);
    
$traer_ides = ("SELECT * FROM noticias WHERE (noticias.cuerpo_noticia LIKE '%".$limpieza_array[$c]."%' OR noticias.titulo_noticia LIKE '%".$limpieza_array[$c]."%' OR noticias.subtitulo_noticia LIKE '%".$limpieza_array[$c]."%') AND (noticias.area_noticia = 'general' OR noticias.area_noticia = 'columna')");
    
$ides_traidos mysql_query($traer_ides$conexportal) or die(mysql_error());
$pablo mysql_fetch_assoc($ides_traidos);
do {
  
$myarreglo[$d] = $pablo["id_noticia"];
$d++;
} while (
$pablo mysql_fetch_assoc($ides_traidos));
}
}
elseif (
$_POST['boton']=='rapida')
{
$d 0;
for (
$c=0;$c<$cantidad;$c++)
{
mysql_select_db($database_conexportal$conexportal);
    
$traer_ides = ("SELECT * FROM noticias WHERE (noticias.titulo_noticia LIKE '%".$limpieza_array[$c]."%' OR noticias.subtitulo_noticia LIKE '%".$limpieza_array[$c]."%') AND (noticias.area_noticia = 'general' OR noticias.area_noticia = 'columna')");
    
$ides_traidos mysql_query($traer_ides$conexportal) or die(mysql_error());
$pablo mysql_fetch_assoc($ides_traidos);
do {
  
$myarreglo[$d] = $pablo["id_noticia"];
$d++;
} while (
$pablo mysql_fetch_assoc($ides_traidos));
}
}
//////////////////////////////////////////////////////////////////////
$myarreglo_limpio array_unique($myarreglo);//contiene todos los id de las noticias encontradas sin repetir
$myarreglo_unido join($myarreglo_limpio);//junta todos los id
/////////////////////////////////////////////////aqui comienza el despliegue y la paginación////////////

if (!isset($pag)) $pag 1// Por defecto, pagina 1
//Cuenta cuantas noticias existen en la consulta
mysql_select_db($database_conexportal$conexportal);
    
$consulta_query_not = ("SELECT COUNT(*) FROM noticias WHERE noticias.id_noticia IN ('".$myarreglo_unido."')");
    
$consulta_reg mysql_query($consulta_query_not$conexportal) or die(mysql_error());

list(
$total) = mysql_fetch_row($consulta_reg);
$tampag 6;
$reg1 = ($pag-1) * $tampag;
///////////////////////////////////////////////////////////////////
mysql_select_db($database_conexportal$conexportal);
    
$query_not "SELECT * FROM noticias WHERE noticias.id_noticia IN ('".$myarreglo_unido."') LIMIT $reg1, $tampag";
    
$reg mysql_query($query_not$conexportal) or die(mysql_error());

if (
mysql_num_rows($reg)){
  echo 
"<table width='550' border = '0'> \n";
  while (
$row = @mysql_fetch_array($reg)) {
  echo 
"<tr><td>".$row["titulo_noticia"]."</td></tr>
        <tr><td>"
.$row["subtitulo_noticia"]."</td></tr>
        <tr><td></td></tr> \n"
;
  }
  echo 
"</table> \n";
}
else
  echo 
"¡ No se ha encontrado ningún registro !";


/* Funcion paginar
 * actual:          Pagina actual
 * total:           Total de registros
 * por_pagina:      Registros por pagina
 * enlace:          Texto del enlace
 * Devuelve un texto que representa la paginacion
 */
function paginar($actual$total$por_pagina$enlace) {
  
$total_paginas ceil($total/$por_pagina);
  
$anterior $actual 1;
  
$posterior $actual 1;

  if (
$actual>1)
    
$texto "<a href=\"$enlace$anterior\">&laquo;</a> ";
  else
    
$texto "<b>&laquo;</b> ";
  for (
$i=1$i<$actual$i++)
    
$texto .= "<a href=\"$enlace$i\">$i</a> ";
  
$texto .= "<b>$actual</b> ";
  for (
$i=$actual+1$i<=$total_paginas$i++)
    
$texto .= "<a href=\"$enlace$i\">$i</a> ";
  if (
$actual<$total_paginas)
    
$texto .= "<a href=\"$enlace$posterior\">&raquo;</a>";
  else
    
$texto .= "<b>&raquo;</b>";
  return 
$texto;
}

echo 
paginar($pag$total$tampag"resultado2.php?pag=");

?>
  #2 (permalink)  
Antiguo 19/07/2005, 10:42
Avatar de illman  
Fecha de Ingreso: mayo-2001
Mensajes: 115
Antigüedad: 22 años, 11 meses
Puntos: 0
una consulta antes de soltar una aberración...
cuando separas las cadenas de búsqueda => e.j. "películas de miedo" lo conviertes a "películas miedo"? o a "películas" + "miedo"?
  #3 (permalink)  
Antiguo 19/07/2005, 14:16
Avatar de PabloP  
Fecha de Ingreso: marzo-2005
Mensajes: 83
Antigüedad: 19 años
Puntos: 0
hago un arreglo en el que una posición tiene "pelicula" y otra posicion tiene "miedo"

en todo caso el problema se me presenta aca.
Código PHP:
<?php
$myarreglo_limpio 
array_unique($myarreglo);//contiene todos los id de las noticias encontradas sin repetir 
$myarreglo_unido join($myarreglo_limpio);
?>
en $myarreglo_unido me quedan todos los id juntos como si formaran un sóloid.

me explico $myarreglo_limpio tiene 1, 2, 19, 34.
al hacer el join me queda 121934 como un todo por lo que nunca encuentra coincidencias.

Última edición por PabloP; 19/07/2005 a las 14:23
  #4 (permalink)  
Antiguo 20/07/2005, 12:04
Avatar de illman  
Fecha de Ingreso: mayo-2001
Mensajes: 115
Antigüedad: 22 años, 11 meses
Puntos: 0
no se si lo acabo de pillar, te explico el proceso que mi lógica me llevaría a resolver este problema:

imagina una búsqueda "películas de miedo", lo que quieres es quitar el "de" para que la búsqueda sea más acertada, con lo que tendrías dos strings "películas"+"miedo".

estos estrings los tienes en una array, haces una busqueda (en mi opinión la búsqueda debería realizarse en varios niveles:

1- buscar "películas de miedo" tal cual sin tocar nada. // colocas los IDs en un array.
2- buscar los "películas" // colocas los IDs en un array
3- buscar "miedo" // colocas los Ids en un array

con este array (donde seguramente tendrás IDs repetidos) haces un bucle para mostrar los resultados en pantalla, y muestras cada ID sin repetir. Para no repetir puesdes filtrar los resultados desde la búsqueda SELECT * from peliculas where ... LIKE %.... and ID <> VALOR DEL ARRAY... o cuando muestras los resultados finales

Vas mostrando los resultados mientras compruebas si esa ID se en encuentra en una posición anterior del array.

No se si me explico
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 15:57.