Foros del Web » Programando para Internet » PHP »

Ayuda paginacion de buscador php mysql

Estas en el tema de Ayuda paginacion de buscador php mysql en el foro de PHP en Foros del Web. Me explico un poco. Tengo un buscador que hice con una combinacion de consultas de busqueda LIKE y FULLTEXT, e incorpore el famoso paginator 1.5 ...
  #1 (permalink)  
Antiguo 30/11/2004, 21:36
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Ayuda paginacion de buscador php mysql

Me explico un poco. Tengo un buscador que hice con una combinacion de consultas de busqueda LIKE y FULLTEXT, e incorpore el famoso paginator 1.5 para la respectiva paginacion.
Para que se muetren los resultados deben cumplirse una serie de condiciones la cuales se ejecutan en el codigo php y aqui esta el problema, para paginar los resultados, el paginator, cuenta todos los registros de la tabla, pero no respeta las condiciones por lo que al paginar no resulta lo esperado, es decir que por ejemplo, si existen 100 registros, me daria un total de 5 paginas de 20 registros por pagina, pero por las candiciones "if" solo se mostrarán "digamos" 40 registros, estos 40 registros se distribiran en las 5 paginas haciendo que no aparezcan 20 registros por pagina o incluso que existan paginas en blanco.

lo que quiero es hacer desde SQL
todo lo que hago con SQL/PHP para la cosulta de
búsqueda fulltext. Gracias de antemano

Este es el codigo
Código PHP:
<?
 
if ($accion == "buscar")
    {
//comienza if accion
    
if ($texto=="" && ($ciudad=="Ciudad" || $ciudad=="Todas") && ($cat=="Categoria" || $cat=="Todas"))
        {echo
"<h2>Puede dejar en blanco el campo de texto, pero debe seleccionar una ciudad y/o una categoria en la cual buscar</h2>";}
    elseif((
$ciudad=="Ciudad" || $ciudad=="Todas") && ($cat=="Categoria" || $cat=="Todas"))
        {echo
"<h2>Seleccione una Ciudad y/o una Categoria en la cual buscar su consulta.</h2>";}
    else 
        {
//comienza la busqueda en si
        
if($texto=="")
            {
$texto="a";}
        include 
"conexion.php";
        if (
$texto<>''){
          
//CUENTA EL NUMERO DE PALABRAS
          
$trozos=explode(" ",$texto);
          
$numero=count($trozos);
          if (
$numero==1) {
            
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON LIKE
            
$_pagi_sql="SELECT * FROM producto WHERE des LIKE '%$texto%' OR tit LIKE '%$texto%' OR llave LIKE '%$texto%'";
          } 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
        
$_pagi_sql="SELECT  * , MATCH (tit, des, llave) AGAINST ('$texto') AS puntuacion
          FROM producto WHERE  MATCH (tit, des, llave) AGAINST ('$texto')"
;
      }
      
if(
$ciudad != "Todas" || $ciudad != "Ciudad")
   {
$_pagi_sql.=" AND ciudad='$ciudad'";}
if(
$cat != "Todas" || $cat != "Categoria")
   {
$_pagi_sql.=" AND cat='$cat'";}

if (
$numero==1
  {
$_pagi_sql.= " ORDER BY id";} 
elseif (
$numero>1
  {
$_pagi_sql.=" ORDER  BY puntuacion";}
    
  
$_pagi_cuantos 3;
      
$_pagi_mostrar_errores true;
      
      include(
"paginator.inc.php");
      while (
$row mysql_fetch_array($_pagi_result))
      {
//Mostramos los registos pedidos         
                    
if("$row['url']"=="")
                        {echo
"<strong><font size=\"3\" color=\"0000FF\">$row['ciudad'] </font></strong><font size=\"1\" color=\"#9999CC\"> $row['ciudad']</font><br>";}
                     else
                        {echo
"<a href=\"$row['ciudad']\" target=\"_blank\"><strong><font size=\"3\" color=\"0000FF\">$row['tit'] 
                        </font></strong></a><font size=\"1\" color=\"#9999CC\"> $row['ciudad']</font><br>"
;}
                       echo
"$row['descripcion']<br>
                     <strong><font color=\"#CCCCCC\">$row['url']</font></strong><br><br>"
;
            
          }
//termina while
    
}
        }
//termina la busqueda en si
    
}//termina if accion
?>

Última edición por jota_22; 07/12/2004 a las 08:19 Razón: icluyo las condiciones desde el sql
  #2 (permalink)  
Antiguo 30/11/2004, 22:42
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Hola...
Qué bueno que lo publicaste acá.
Mira, para empezar sería bueno que te refieras a los campos por su nombre y no por la posicón que ocupan en el resultado. O sea, mediante el array asociativo.
$row['nombre_campo'] en lugar de $row[0]... de esa manera será más fácil ayudarte a construir el SQL que necesitas porque conoceremos el nombre de los campos.

Aunque supongo ue será tan fácil como agregar condiciones (AND's y OR's en tu caso) según los if's... o sea, ir construyendo el sql a partir de las condiciones... tal vez me equivoque.

Saludos
  #3 (permalink)  
Antiguo 01/12/2004, 23:31
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Ufff... yo estaba esperando que respondas.... y no dí en la cuenta que ya habías editado tu mensaje.
Por favor, si no quieres repetir tanto código, postea una respuesta diciendo que ya editaste el original. De esa manera el mensaje se va al comienzo de la lista y además así me entero de que has respondido.

Y ya que estás editando, por favor pon el código entre los tags de PHP [ PHP] y [ /PHP] (sin el espacio dentro de los corchetes.)

Saludos
  #4 (permalink)  
Antiguo 05/12/2004, 18:45
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Hola:
No sé si no me entendiste...
Lo que te digo es que tienes que hacer una evaluación de las condiciones mientras vas construyendo el sql.
Código PHP:
$_pagi_sql "SELECT * FROM producto WHERE des LIKE '%$texto%' OR tit LIKE '%$texto%' OR llave LIKE '%$texto%'";
if(
condición=tal){
  
$_pagi_sql.= " AND ciudad = '$ciudad'";
}
if(
otra_condición=otra){
   
$_pagi_sql.= " AND campo2 = '$campo'";
}
$_pagi_sql.= " ORDER BY id"
La idea es algo así... trata de implementarla y postea aquí lo que no te sale.
Saludos
  #5 (permalink)  
Antiguo 05/12/2004, 21:26
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Ok gracias (soy nuevo perdon),
Entiendo algo, es decir que si pongo
Código PHP:
$_pagi_sql.= " AND ciudad = '$ciudad'"
y luego
Código PHP:
$_pagi_sql.= " AND campo2 = '$campo'"
se añadira automaticamente a la sentencia sql? (eso no lo sabia),
Algo mas, no estoy enterado de esta forma de sentencia sql, me prodrias explicar un poco mas sobre los AND's, y aparte, como se tratarian las cosultas de
búsqueda fulltext con este metodo?, de la misma manera? Gracias por su paciencia.
  #6 (permalink)  
Antiguo 06/12/2004, 14:10
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Ya lo probe, pero creo que lo estoy haciendo mal, por que con este codigo, al
hacer la busqueda me da como resultado todos los datos de la tabla (no cumple las condiciones), ya edite el codigo completo en el primer mensaje esto es lo que hice:

Código PHP:
 //prueba de condiciones abro tabla ciudad para comparar
      
$cadbusca="SELECT * FROM ciudad ORDER BY id";
      
$result=mysql_query($cadbusca$conexion);
      while(
$row=mysql_fetch_row($result))
              if(
"$row['nombre']"==$ciudad)
                {
$_pagi_sql.=" AND ciudad = '$ciudad'"; }
                
        
//comparamos categoria desde la tabla cat        
        
$cadbusca="SELECT * FROM cat ORDER BY id";
      
$result=mysql_query($cadbusca$conexion);
      while(
$row=mysql_fetch_row($result))
              if(
"$row['nombre']"==$cat)
                {
$_pagi_sql.=" AND cat = '$cat'"; } 

Última edición por jota_22; 06/12/2004 a las 14:34
  #7 (permalink)  
Antiguo 06/12/2004, 20:20
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Cita:
Iniciado por jota_22
Ya lo probe, pero creo que lo estoy haciendo mal, por que con este codigo, al
hacer la busqueda me da como resultado todos los datos de la tabla (no cumple las condiciones), ya edite el codigo completo en el primer mensaje esto es lo que hice:

Código PHP:
 //prueba de condiciones abro tabla ciudad para comparar
       
id";$cadbusca="SELECT FROM ciudad ORDER BY
      $result
=mysql_query($cadbusca$conexion);
      while(
$row=mysql_fetch_row($result))
              if(
"$row['nombre']"==$ciudad)
                {
$_pagi_sql.=" AND ciudad = '$ciudad'"; }
                
        
//comparamos categoria desde la tabla cat        
        
$cadbusca="SELECT * FROM cat ORDER BY id";
      
$result=mysql_query($cadbusca$conexion);
      while(
$row=mysql_fetch_row($result))
              if(
"$row['nombre']"==$cat)
                {
$_pagi_sql.=" AND cat = '$cat'"; } 
La idea es generar TODO el sql antes de hacer el mysql_query() (o incluir el Paginator)...Si lo que quieres es sólo los registros de la tabla "ciudad" en donde el valor del campo "ciudad" sea igual al que contiene la variable $ciudad ordenados por id... entonces el sql debe ser:
Código PHP:
$cadbusca="SELECT * FROM ciudad WHERE ciudad='$ciudad' ORDER BY id 
En general si tuvieras más de ua condición...
Código PHP:
$sql "SELECT * FROM tabla WHERE campo1=valor1 AND campo2=valor2"
Pero todo esto es SQL básico... lo que te recomiendo es leer un manual de sql para que conozcas más del tema.

Saludos
  #8 (permalink)  
Antiguo 06/12/2004, 21:07
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Si entiendo eso, gracias pero lo que quiero ahora es hacer la busqueda del texto introducido junto con los ANDs, tengo que hacer una combinacion asi?

Código PHP:
$sql="SELECT * FROM producto WHERE des LIKE '%$texto%' OR tit LIKE '%$texto%' OR llave LIKE '%$texto%' AND campo1='$valor1' AND campo2='$valor2' ORDER BY id"
Y que hacer para el fulltext,
algo como esto?
Código PHP:
$sql="SELECT  * , MATCH (tit, des, llave) AGAINST ('$texto') AS puntuacion 
          FROM producto WHERE  MATCH (tit, des, llave) AGAINST ('$texto') AND campo1='$valor1' AND campo2='$valor2' ORDER  BY puntuacion"

o esta mal, si es asi entonces quisiera porfavor que me aconsejen un manual que explique este tema a profundidad, lo mas detallado posible. Muchas gracias.
  #9 (permalink)  
Antiguo 06/12/2004, 21:11
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Sí... eso es lo que tienes que hacer.

Saludos
  #10 (permalink)  
Antiguo 06/12/2004, 22:20
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Bien, ya hice todo lo que me dijo, todo parece funcionar bien exepto por un error, funciona perfectamente cuando se introduce un texto en la variable '$texto' pero se siguen mostrando todos los registros de la tabla cuando se busca solo por categoria '$cat' y ciudad '$ciudad' (el $texto es = "a" cuando esta vacio), para que me entienda mejor, tengo estas tablas, (ciudad, cat, producto). Para construir el '$_pagi_sql' (en base a la tabla producto), y agragar los ANDs, debo hacer una comparacion de las variables '$ciudad' y '$cat' recorriendo las tablas (ciudad, cat) respectivamente vea mi codigo alla arriba que lo madifique tal y como esta con todo arreglado. Que esta mal?
  #11 (permalink)  
Antiguo 06/12/2004, 22:35
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
No entiendo para qué recorres todo el resultSet comparando... si lo puedes poner directamente en el SQL...

Tu sql tienes que tenerlo algo así... Pero por favor la idea es que entiendas cómo se hace y no que copies y pegues lo te escribo porque yo te estoy poniendo un ejemplo...
Por eso te recomiendo leer un manual de Sql primero.
Código PHP:
 $sql="SELECT * FROM producto WHERE des LIKE '%$texto%' OR tit LIKE '%$texto%' OR llave LIKE '%$texto%' AND cat='$cat' AND ciudad='$ciudad' ORDER BY id"
Después de hacer mysql_query() (o include(paginator)) lo que modifiques en $_pagi_sql ya no valdrá de nada.

saludos
  #12 (permalink)  
Antiguo 06/12/2004, 22:47
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
UPS!!!
Tienes razon que despistado que soy, errores de principiante jajajaja.
Ok leere un manual Gracias por la paciencia.
Saludos.

Última edición por jota_22; 07/12/2004 a las 07:59
  #13 (permalink)  
Antiguo 07/12/2004, 08:27
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Surge nuevo problema, en realidad el mismo, no respeta los ADN's, al hacer esta sentencia.
Despues de construirla completamente queda asi.
Código PHP:
$sql="SELECT * FROM producto WHERE des LIKE '%$texto%' OR tit LIKE '%$texto%' OR llave LIKE '%$texto%' AND ciudad='$ciudad' AND cat='$cat' ORDER BY id" 
cuando $texto="a", me muestra todos los datos de la tabla sin respetar los AND's.
Edite el codigo completo en el primer mensaje
La tabla producto esta bien construida. Ayuda porfavor.
Con respecto a copiar lo que me das de ejemplos, no los copio sino que das el ejemplo de mi codigo por lo que es el mismo ($sql == $_pagi_sql).

Última edición por jota_22; 07/12/2004 a las 08:39
  #14 (permalink)  
Antiguo 07/12/2004, 14:15
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Ok...
Probablemente esa mezcla de OR's y AND's sea el problema... lo que tienes que hacer es poner entre paréntesis lo que se pueda agrupar.... supongo que deben ser las tres primeras condiciones (que son las que tienen "OR")...
Código PHP:
 $sql="SELECT * FROM producto WHERE (des LIKE '%$texto%' OR tit LIKE '%$texto%' OR llave LIKE '%$texto%') AND ciudad='$ciudad' AND cat='$cat' ORDER BY id"
Saludos
  #15 (permalink)  
Antiguo 07/12/2004, 14:35
Avatar de jota_22  
Fecha de Ingreso: noviembre-2004
Mensajes: 83
Antigüedad: 19 años, 4 meses
Puntos: 0
Bien gracias por todo, al fin mi buscador funciona tal y como lo deseo, solo tengo una pequeña duda que ya la postee como un nuevo tema,

http://www.forosdelweb.com/f21/aconsejenme-sobre-buscador-php-mysql-252592/

Que pasaria si los registros se exeden demasiado (1 millon es el caso de google) talvez algun dia llegue a esa cantidad, por eso pregunto. Mi buscador seria demasiado lento? o no seria problema.
Gracias.
  #16 (permalink)  
Antiguo 07/12/2004, 15:11
 
Fecha de Ingreso: mayo-2004
Ubicación: pereira
Mensajes: 11
Antigüedad: 19 años, 11 meses
Puntos: 0
necesito ayuda

hola jotaa.


me gustaria que me ayudaras por favor acerca de el php lo manejo mas o menos pero me falta aprender algunas cosas


gracias
  #17 (permalink)  
Antiguo 07/12/2004, 15:17
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
jackfort

Si requieres ayuda "personal" pidela por mensaje privado a la persona que te refieras .. Si quieres que te ayudemos en general todos .. haz tu pregunta en un tema nuevo y sobre todo sobre algún tema en -concreto- ..

Un saludo,
  #18 (permalink)  
Antiguo 20/11/2007, 09:50
 
Fecha de Ingreso: noviembre-2007
Mensajes: 1
Antigüedad: 16 años, 4 meses
Puntos: 0
Ayuda buscador con paginacion en php mysql

Hola amigo tengo un problema con el buscador de mis videos en mi web lo puse un paginador, el detalles es que al momento de hacer la busqueda encuentra todo osea el total de videos existentes arrojando en la primera pagina los 10 priemros videos pero al momento de ir ala siguiente pagina ya no funciona no se si me podrias ayudar un saludo y muchas gracias

aca tienes el url
http://www.videosflow.com/videos/buscar.php?q=corazon+serrano&search=true
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 05:11.