Guest id194 Posted July 14, 2006 at 03:54 PM Report #38271 Posted July 14, 2006 at 03:54 PM Num outro lado queriam tirar uma dúvida sobre criar uns links para paginação e eu acabei por reescrever o código de forma que a paginação funcionasse como pretendido. Decidi também posta-lo aqui pois pode ser útil a alguem. <?php // Numero de links a mostrar e total de paginas $pages_show = 5; $pages_count = 10; // Que pagina estamos a ver? if (isset($_GET['page'])) { $page = $_GET['page']; // Verifica se a pagina esta dentro dos limites if ($page < 1) { $page = 1; } elseif ($page > $pages_count) { $page = $pages_count; } } else { $page = 1; } // Calcula o inicio e fim do ciclo $start = $page - floor($pages_show/2); $end = $page + floor($pages_show/2); /* Define manualmente o inicio e fim do ciclo se estivermos nas primeiras ou ultimas paginas */ if ($start < 1) { $start = 1; $end = $pages_show; } else if ($end > $pages_count) { $start = $pages_count - $pages_show + 1; $end = 10; } else { /* Incrementa 1 valor ao inicio do ciclo se o numero de links for par, caso contrario iremos ter um link a mais */ if (!($pages_show%2)) { $start++; } } // Define o link para a pagina anterior a actual if ($page == 1) { $pages_html = '<< Anterior | '; } else { $pages_html = '<a href="'.$_SERVER['PHP_SELF'].'?page='.($page-1).'"><< Anterior</a> | '; } // for ($i = $start; $i <= $end; $i++) { if ($i == $page) { $pages_html .= $i.' '; } else { $pages_html .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a> '; } } // Define o link para a pagina a seguir a actual if ($page >= $pages_count) { $pages_html .= '| Seguinte >>'; } else { $pages_html .= '| <a href="'.$_SERVER['PHP_SELF'].'?page='.($page+1).'">Seguinte >></a>'; } // Imprime a paginacao no ecra echo $pages_html; ?> O output será tipo: Página 1: << Anterior | 1 2 3 4 5 | Próxima >> Página 2: << Anterior | 1 2 3 4 5 | Próxima >> Página 3: << Anterior | 1 2 3 4 5 | Próxima >> Página 4: << Anterior | 2 3 4 5 6 | Próxima >> Página 5: << Anterior | 3 4 5 6 7 | Próxima >> Página 6: << Anterior | 4 5 6 7 8 | Próxima >> Página 7: << Anterior | 5 6 7 8 9 | Próxima >> Página 8: << Anterior | 6 7 8 9 10 | Próxima >> Página 9: << Anterior | 6 7 8 9 10 | Próxima >> Página 10: << Anterior | 6 7 8 9 10 | Próxima >>
skin Posted July 14, 2006 at 05:54 PM Report #38287 Posted July 14, 2006 at 05:54 PM muito bom o script 😄 Our lives begin to end the day we become silent about things that matter - Martin Luther King
karva Posted July 14, 2006 at 07:51 PM Report #38307 Posted July 14, 2006 at 07:51 PM ta bakano, inda nao tinha encontrado nenhum memo de jeito, mas este ta mt fixe... boa... Proud LEIC-A@IST student!
Guest id194 Posted July 22, 2006 at 04:25 PM Report #39618 Posted July 22, 2006 at 04:25 PM Pessoal, estava eu a adaptar isto ao meu fotolog quando descobri um bug. Supondo que nós definimos para aparecer 5 links de paginação mas apenas existem 3 (ex: 10 items por página e temos 25 items) os 5 links de paginção iriam ser apresentados, quando o 4º e 5º link iriam produzir uma página errada não existente. o mesmo iria acontecer quando tivessemos na última página, neste caso, na 3ª onde iriam ser produzidos o link -1 e 0. Para contornar o problema, antes de definirmos o $start e $end perguntamos se $pages_count é inferior ao $pages_show. Caso seja, definimos o $start = 1 e o $end = $pages_count. O bloco de código alterado iria ficar do genero: if ($pages_count < $pages_show) { $start = 1; $end = $pages_count; } else { // Calcula o inicio e fim do ciclo $start = $page - floor($pages_show/2); $end = $page + floor($pages_show/2); /* Define manualmente o inicio e fim do ciclo se estivermos nas primeiras ou ultimas paginas */ if ($start < 1) { $start = 1; $end = $pages_show; } else if ($end > $pages_count) { $start = $pages_count - $pages_show + 1; $end = 10; } else { /* Incrementa 1 valor ao inicio do ciclo se o numero de links for par, caso contrario iremos ter um link a mais */ if (!($pages_show%2)) { $start++; } } }
Ivo Pereira Posted January 8, 2010 at 10:07 PM Report #304906 Posted January 8, 2010 at 10:07 PM Tenho uma dúvida. Gostava de saber como saber exactamente o número de páginas de acordo com os items que tenho na BD. Sugestões? Abraço
scorch Posted January 8, 2010 at 10:16 PM Report #304907 Posted January 8, 2010 at 10:16 PM Divides pelo número de items por página, e se o resto for diferente de zero, adicionas mais um à divisão. PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
Ivo Pereira Posted January 8, 2010 at 11:24 PM Report #304924 Posted January 8, 2010 at 11:24 PM Mas como faço isso com o recurso ao SQL ? ? Já noutro tópico me tentaram explicar, mas eu não percebi bem 😞
scorch Posted January 8, 2010 at 11:35 PM Report #304928 Posted January 8, 2010 at 11:35 PM Fazes a query a seleccionar os registos que vais precisar. Depois usas o mysql_num_rows(). $nRegistos = mysql_num_rows($query); Depois, basta fazeres isto: //O número 10 é um exemplo. $nPaginas = $nRegistos / 10; if ($nRegistos % 10 != 0){ $nPaginas++; } PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
Ivo Pereira Posted January 9, 2010 at 10:47 AM Report #304951 Posted January 9, 2010 at 10:47 AM Boas, obrigado pela resposta, tenho o seguinte código: <?php require_once('../db/ligar.php'); $sql = mysql_query("SELECT ID FROM tv_noticias ORDER BY date"); for ($pass = 0; $pass < mysql_num_rows($sql); $pass++) { $nr_items = mysql_num_rows($sql); // Numero de links a mostrar e total de paginas $pages_show = 5; $pages_count = $nr_items / 10; if ($nr_items % 10 != 0){ $pages_count++; } // Que pagina estamos a ver? if (isset($_GET['page'])) { $page = $_GET['page']; // Verifica se a pagina esta dentro dos limites if ($page < 1) { $page = 1; } elseif ($page > $pages_count) { $page = $pages_count; } } else { $page = 1; } // Calcula o inicio e fim do ciclo $start = $page - floor($pages_show/2); $end = $page + floor($pages_show/2); /* Define manualmente o inicio e fim do ciclo se estivermos nas primeiras ou ultimas paginas */ if ($start < 1) { $start = 1; $end = $pages_show; } else if ($end > $pages_count) { $start = $pages_count - $pages_show + 1; $end = 10; } else { /* Incrementa 1 valor ao inicio do ciclo se o numero de links for par, caso contrario iremos ter um link a mais */ if (!($pages_show%2)) { $start++; } } // Define o link para a pagina anterior a actual if ($page == 1) { $pages_html = '<< Anterior | '; } else { $pages_html = '<a href="'.$_SERVER['PHP_SELF'].'?page='.($page-1).'"><< Anterior</a> | '; } // for ($i = $start; $i <= $end; $i++) { if ($i == $page) { $pages_html .= $i.' '; } else { $pages_html .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a> '; } } // Define o link para a pagina a seguir a actual if ($page >= $pages_count) { $pages_html .= '| Seguinte >>'; } else { $pages_html .= '| <a href="'.$_SERVER['PHP_SELF'].'?page='.($page+1).'">Seguinte >></a>'; } // Imprime a paginacao no ecra echo $pages_html; ?> No entanto dá-me erro na última linha do código: Parse error: syntax error, unexpected $end in public_html/v2/lib/pagination.php on line 86 Penso que seja algo mal fechado do código aí em cima, mas não consigo encontrar o quê 👍
scorch Posted January 9, 2010 at 01:17 PM Report #304969 Posted January 9, 2010 at 01:17 PM Tenta assim. Tirei-te o primeiro For, não precisas dele. <?php require_once('../db/ligar.php'); $sql = mysql_query("SELECT ID FROM tv_noticias ORDER BY date"); $nr_items = mysql_num_rows($sql); // Numero de links a mostrar e total de paginas $pages_show = 5; $pages_count = $nr_items / 10; if ($nr_items % 10 != 0){ $pages_count++; } // Que pagina estamos a ver? if (isset($_GET['page'])) { $page = $_GET['page']; // Verifica se a pagina esta dentro dos limites if ($page < 1) { $page = 1; } elseif ($page > $pages_count) { $page = $pages_count; } } else { $page = 1; } // Calcula o inicio e fim do ciclo $start = $page - floor($pages_show/2); $end = $page + floor($pages_show/2); /* Define manualmente o inicio e fim do ciclo se estivermos nas primeiras ou ultimas paginas */ if ($start < 1) { $start = 1; $end = $pages_show; } else if ($end > $pages_count) { $start = $pages_count - $pages_show + 1; $end = 10; } else { /* Incrementa 1 valor ao inicio do ciclo se o numero de links for par, caso contrario iremos ter um link a mais */ if (!($pages_show%2)) { $start++; } } // Define o link para a pagina anterior a actual if ($page == 1) { $pages_html = '<< Anterior | '; } else { $pages_html = '<a href="'.$_SERVER['PHP_SELF'].'?page='.($page-1).'"><< Anterior</a> | '; } // for ($i = $start; $i <= $end; $i++) { if ($i == $page) { $pages_html .= $i.' '; } else { $pages_html .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a> '; } } // Define o link para a pagina a seguir a actual if ($page >= $pages_count) { $pages_html .= '| Seguinte >>'; } else { $pages_html .= '| <a href="'.$_SERVER['PHP_SELF'].'?page='.($page+1).'">Seguinte >></a>'; } // Imprime a paginacao no ecra echo $pages_html; ?> PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
Ivo Pereira Posted January 9, 2010 at 01:29 PM Report #304972 Posted January 9, 2010 at 01:29 PM Hmm, realmente apareceu no site, mas apareceu logo: << Anterior | 1 2 3 4 5 | Seguinte >> E o que eu queria mesmo, era que ele me calculasse o número de páginas de acordo com o de items na BD. Por exemplo, só tenho 2 items na bd. No entanto quero me mostre um máximo de 5 por máximo, e a partir daí fazer a paginação. Como só tenho dois items deveria-me ter ficado algo só com uma página. Percebeste? 👍
Guest id194 Posted January 9, 2010 at 03:13 PM Report #304992 Posted January 9, 2010 at 03:13 PM Para isso basta modificares as duas variáveis no topo do script para se ajustar as tuas necessidades. Usa mysql_num_rows() para veres quantos registos tem a query.
Ivo Pereira Posted January 9, 2010 at 03:22 PM Report #304994 Posted January 9, 2010 at 03:22 PM Mas eu usei, como podes ver no código que postei: $nr_items = mysql_num_rows($sql);
scorch Posted January 9, 2010 at 10:14 PM Report #305067 Posted January 9, 2010 at 10:14 PM Defines a variável $pages_show no ínicio do script, com o número de páginas que quiseres. PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
Ivo Pereira Posted January 9, 2010 at 11:59 PM Report #305120 Posted January 9, 2010 at 11:59 PM Acho que não me fiz entender, eu quero que isso o calcule automaticamente, de acordo com o nr. de items que existir...
Guest id194 Posted January 10, 2010 at 02:54 PM Report #305209 Posted January 10, 2010 at 02:54 PM Acho que já percebi o que tu queres... Os teus cálculos estão bem feitos, o número de páginas correcto está lá, mas nos links, só aparece 5. Se tiver mais, o script adapta-se a esse valor quando estiveres na página 5 (como podes ver no exemplo do primeiro post). Se queres que os links para TODAS as páginas apareçam no ecrã tens duas soluções: Solução fácil: Iguala o $pages_show ao $pages_count e move esse linha para debaixo do $pages_count. Solução "difícil": Usando a solução fácil parte do código fica completamente desnecessário. Os 3 ciclos fors podem ser substituídos por um, e as variáveis de iteração adaptadas ao número total de páginas. Se o problema não é este, então não estou a perceber definitivamente o que queres...
Ivo Pereira Posted January 10, 2010 at 02:59 PM Report #305212 Posted January 10, 2010 at 02:59 PM Deixa-me ver se consigo explicar de outra forma. Neste momento tenho, 2 items na base de dados, correcto? Pronto. Como tal, se quero 5 items no máximo por página (atenção só tenho 2!), logo o suposto era só aparecer para escolher a primeira página, certo? Porque as outras não podem existir porque nem existem items suficientes para fazer uma página! Então o problema é que, só tendo 2 items, na paginação continua a aparecer-me: << Anterior | 1 2 3 4 5 | Seguinte >> Quando supostamente deveria aparecer << Anterior | 1 | Seguinte >> E o Anterior e o Seguinte nem deveriam dar para clicar, pois não existem mais páginas!
Guest id194 Posted January 10, 2010 at 03:03 PM Report #305214 Posted January 10, 2010 at 03:03 PM Então corrige o script porque pelos vistos não pensei nesse pormenor quando o fiz 🙂 E para que é isto: for ($pass = 0; $pass < mysql_num_rows($sql); $pass++) { $nr_items = mysql_num_rows($sql); Pensa bem no que estás a fazer... Quanto ao resto, tens razão, tem alguns bugs... O script está a precisar de uma revisão para contemplar todos os casos possíveis. Mas eu estou sem tempo e paciência. Talvez seja melhor criares um outro tópico e mostrares o teu código actual que deves ter mais ajuda do que continuar a discussão aqui. Depois, se chegares a uma solução, posta o teu resultado aqui ou noutro tópico dentro desta mesma secção.
scorch Posted January 10, 2010 at 09:09 PM Report #305282 Posted January 10, 2010 at 09:09 PM Fizes-te-te entender. Acho é que tu não entendes-te muito bem. 🙂 Faz isto. <?php require_once('../db/ligar.php'); $sql = mysql_query("SELECT ID FROM tv_noticias ORDER BY date"); $nr_items = mysql_num_rows($sql); // Numero de links a mostrar e total de paginas $pages_show = 5; $pages_count = $nr_items / 10; if ($nr_items % 10 != 0){ $pages_count++; } $pages_show = $pages_count; // Que pagina estamos a ver? if (isset($_GET['page'])) { $page = $_GET['page']; // Verifica se a pagina esta dentro dos limites if ($page < 1) { $page = 1; } elseif ($page > $pages_count) { $page = $pages_count; } } else { $page = 1; } // Calcula o inicio e fim do ciclo $start = $page - floor($pages_show/2); $end = $page + floor($pages_show/2); /* Define manualmente o inicio e fim do ciclo se estivermos nas primeiras ou ultimas paginas */ if ($start < 1) { $start = 1; $end = $pages_show; } else if ($end > $pages_count) { $start = $pages_count - $pages_show + 1; $end = 10; } else { /* Incrementa 1 valor ao inicio do ciclo se o numero de links for par, caso contrario iremos ter um link a mais */ if (!($pages_show%2)) { $start++; } } // Define o link para a pagina anterior a actual if ($page == 1) { $pages_html = '<< Anterior | '; } else { $pages_html = '<a href="'.$_SERVER['PHP_SELF'].'?page='.($page-1).'"><< Anterior</a> | '; } // for ($i = $start; $i <= $end; $i++) { if ($i == $page) { $pages_html .= $i.' '; } else { $pages_html .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a> '; } } // Define o link para a pagina a seguir a actual if ($page >= $pages_count) { $pages_html .= '| Seguinte >>'; } else { $pages_html .= '| <a href="'.$_SERVER['PHP_SELF'].'?page='.($page+1).'">Seguinte >></a>'; } // Imprime a paginacao no ecra echo $pages_html; ?> PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
Ivo Pereira Posted January 10, 2010 at 10:46 PM Report #305318 Posted January 10, 2010 at 10:46 PM Boas, e obrigado pela resposta de ambos. scorch, podes dizer-me o que mudaste? Btw, agora realmente só mostra << Anterior | 1 | Seguinte >>, mas sendo possível clicar no Seguinte, ao clicar irá aparecer << Anterior | 1.2 | Seguinte >> (e neste só fica possível clicar no Anterior).
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now