Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou precisando implementar uma paginação no meu site de fotografias mas está dando problema no array_chunk. Qual outra função eu poderia usar para fazer o cálculo com pdo? Desde já agradeço.
<section class="container galeria">
<ul class="inline">
<?php
$pegar_galerias = $pdo->prepare("SELECT * FROM `fotos` ORDER BY id DESC");
$pegar_galerias->execute();
if($pegar_galerias->rowCount() == 0){
echo
'<div class="jumbotron">
<h1>Não existem galerias cadastradas!</h1>
<p>Acesse a área administrativa utilizando o seu login e senha e crie uma galeria para que possa vê-la na página inicial!</p>
</div>';
}else{
$galeria = $pegar_galerias->fetchObject();
/*$arquivo = glob('./adm/imagens/*.*');*/
$qtd = 8;
$atual = (isset($_GET['pg'])) ? intval($_GET['pg']) : 1;
$pagArquivo = array_chunk($galeria, $qtd);
$contar = count($pagArquivo);
$resultado = $pagArquivo[$atual-1];
foreach ($resultado as $valor) {
printf('<img src="%s" width="100"/>', $valor);
}
echo '<hr />';
for ($i=1; $i < $contar ; $i++) {
if ($i == $atual) {
printf('<a href="#">(%s)</a>', $i);
}else{
printf('<a href="?pg=%s">%s</a>', $i, $i);
}
?>
<li>
<div class="row">
<div class="span3">
<a href="./adm/visualizar_galeria.php?galeria_id=<?php echo $galeria->id_ga;?>">
<img src="./adm/imagens/<?php echo $galeria->miniatura;?>" class="img-polaroid" width="250" height="250" />
</a>
<h5><?php echo $galeria->titulo;?></h5>
</div><!--span3-->
</div><!--row-->
</li>
<?php }}?>
</ul>Pessoal, a ideia é a seguinte:
Tenho um site de fotografias, onde quero que a primeira página exiba as 20 últimas fotos postadas. E abaixo delas gostaria que aparecesse os links da paginação. Estou tentando com o código abaixo, mas está dando o seguinte erro:
-
Warning: Invalid argument supplied for foreach() in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\data\localweb\malcoln\galeria.php on line 163
<<< 1 2 3 4 5 6 7 8 9>>>
Com esse código
echo '<pre>';
print_r($total_registros);
echo '</pre>';
consigo ver o que a variável $total_registros = 1; está exibindo. E mostra que está certo pois está mostrando que a página é a 1. Por que então aparece a mensagem de erro?;
<section class="container galeria">
<ul class="inline">
<?php
$limite = 20;//aqui, vou exibir até 10 registros por página!
$pagina = $_GET['pag'];//pega o valor passado por parâmetro e atribui na variável
if(!isset($pagina) || $pagina == ''){//se não existir $pagina ou $pagina for igua a "vazio"
$pagina = 1;//$pagina é igual a um
}
$inicio = ($pagina * $limite) - $limite;
$pegar_galerias = $pdo->prepare("SELECT * FROM fotos ORDER BY id LIMIT " . $inicio . "," . $limite);
try{
//$query = $conecta->prepare($sql);
$pegar_galerias->execute();
$resultado = $pegar_galerias->fetchObject();
}catch(PDOException $erro){
echo $erro->getMessage();
echo '';
echo $resultado;
}
$pegar_galerias = $pdo->prepare("SELECT * FROM fotos");
try{
//$query = $conecta->prepare($sql);
$pegar_galerias->execute();
$resultado = $pegar_galerias->fetchObject();
}catch(PDOException $erro){
echo $erro->getMessage();
echo '';
echo $resultado;
}
$total_registros = 1;
echo '<pre>';
print_r($total_registros);
echo '</pre>';
foreach($total_registros as $total){
$total_registros++;
}
$total_paginas = ceil($total_registros / $limite);
if ($total_paginas > 1) {
$anterior = $total_paginas - 1;
} else {
$anterior = '1';
}
if ($total_paginas < ($total_paginas - 2)) {
$proximo = $total_paginas + 1;
} else {
$proximo = $total_paginas;
}
$contador = 0;
if ($total_paginas < 6) {
$comeca = 1;
$termina = 9;
} else if ($total_paginas > ($total_paginas - 6)) {
$comeca = $total_paginas - 6;
$termina = $total_paginas;
} else {
$comeca = $total_paginas - 4;
$termina = $total_paginas + 5;
}
echo '';
echo '' . '<<' . '';
echo '' . '<' . '';
for ($link_pagina = $comeca; $link_pagina <= $termina; $link_pagina++) {
if ($contador < 9) {
if ($total_paginas == $link_pagina) {
echo '' . $link_pagina . ''; // Escreve somente o número da página sem ação alguma
} else {
echo ' ' . $link_pagina . ''; // Escreve o número e o link da página
}
$contador++;
}
}
echo '' . '>' . '';
echo '>>';
echo '';
?>
<?php include ("./footer.html");?>
</section>foreach espera que o valor passado seja um array, o que no caso não é, por isto o erro.
Ok Edgar Serra, obrigado pelo esclarecimento.
>
http://blog.thiagobelem.net/entendendo-a-paginacao-de-registros-no-mysql/
http://blog.thiagobelem.net/sistema-de-busca-em-php-e-mysql/
Thiago, estou tentando implementar o seu código. Estou usando pdo. Está dando esse erro na linha 143:
-
Warning: mysql_result() expects parameter 1 to be resource, object given in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\data\localweb\malcoln\galeria1.php on line 143
Resultados - de resultados encontrados para '1'
Nessa linha há o seguinte código: $total = mysql_result($pegar_fotos, 0, 'total');
Além disso ele está gerando os 20 itens por página e o título debaixo de cada foto, porém a foto não aparece. Pode me ajudar?
Meu código completo:
<section class="container galeria">
<ul class="inline">
<?php
$_BS['PorPagina'] = 20;
$pag = $_GET['pag'];
$pegar_fotos = $pdo->prepare("SELECT COUNT(*) AS total FROM `fotos`");
$pegar_fotos->execute();
$total = mysql_result($pegar_fotos, 0, 'total');
$paginas = (($total % $_BS['PorPagina']) > 0) ? (int)($total / $_BS['PorPagina']) + 1 : ($total / $_BS['PorPagina']);
if (isset($_GET['pag'])) {
$pagina = (int)$_GET['pag'];
} else {
$pagina = 1;
}
$pagina = max(min($paginas, $pagina), 1);
$inicio = ($pagina - 1) * $_BS['PorPagina'];
$pegar_fotos = $pdo->prepare("SELECT * FROM `fotos` ORDER BY `id` DESC LIMIT ".$inicio.", ".$_BS['PorPagina']);
$pegar_fotos->execute();
//$query = mysql_query($sql);
echo "<p>Resultados ".min($total, ($inicio + 1))." - ".min($total, ($inicio + $_BS['PorPagina']))." de ".$total." resultados encontrados para '".$_GET['pag']."'</p>";
//echo "<ul>";
if($pegar_fotos->rowCount() == 0){
echo
'<div class="jumbotron">
<h1>Não existem galerias cadastradas!</h1>
<p>Acesse a área administrativa utilizando o seu login e senha e crie uma galeria para que possa vê-la na página inicial!</p>
</div>';
}else{
while ($fotos = $pegar_fotos->fetchObject()){
?>
<li>
<div class="row">
<div class="span3">
<a href="./adm/galeria.php?galeria_id=<?php echo $galeria->id;?>">
<img src="./adm/imagens/<?php echo $fotos->capa;?>" class="img-polaroid" width="250" height="250" alt="foto" />
</a>
<h5><?php echo $fotos->titulo;?></h5>
</div><!--span3-->
</div><!--row-->
</li>
<?php }
if ($total > 0) {
for($n = 1; $n <= $paginas; $n++) {
echo '<a href="?consulta='.$_GET['consulta'].'&pagina='.$n.'">'.$n.'</a> ';
}
}
}?>
<?php}}?>
</ul>
<?php include ("./footer.html");?>
</section><!--container-->Troque:
$total = mysql_result($pegar_fotos, 0, 'total');
Por
$total = $pdo->fetchColumn();
Se ficar em branco há algo de errado na query, neste caso após o ->execute:
print_r($pdo->errorInfo());
>
Troque:
$total = mysql_result($pegar_fotos, 0, 'total');
Por
$total = $pdo->fetchColumn();
Se ficar em branco há algo de errado na query, neste caso após o ->execute:
print_r($pdo->errorInfo());
Ótimo ESerra, começou a dar certo!!!!! Coloquei dessa forma: $total = $pegar_fotos->fetchColumn();
E apareceu o total de páginas e a quantidade mostrada, com a paginação: Resultados 1 - 20 de 55 resultados encontrados para '1'
Apareceram 3 páginas no total.
Agora só falta fazer aparecer as imagens na galeria (aparecem 20 itens, porém como link "quebrado"). Os títulos das fotos estão sendo mostrados corretamente.
Valeu mesmo. Vou tomar um banho e voltar mais tarde para "quebrar" a cabeça um pouco mais.
Em vez de $pdo-> use $pegar_fotos->
O problema com as imagens foi solucionado. Havia um erro nessa linha:
<img src="./adm/imagens/<?php echo $fotos->miniatura;?>" class="img-polaroid" width="250" height="250" alt="foto" />
No lugar de miniatura estava capa. Na verdade, capa era um campo da tabela galerias e não da tabela fotos.
Outra dúvida: para testar o funcionamento do código eu estava fazendo da seguinte forma: na index eu criei um link que passava por parâmetro o número da página para o arquivo galeria1.php: <a href="./galeria1.php?pag=1">Galeria</a>
Acontece que eu quero que o código de paginação fique na primeira página.Ou seja, na index sempre aparecerão as fotos mais recentes adicionadas ao banco.
Aparecem essas mensagens:
-
Notice: Undefined index: consulta in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\data\localweb\malcoln\galeria1.php on line 128
$busca = $_GET['consulta'];
Notice: Undefined index: pag in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\data\localweb\malcoln\galeria1.php on line 131
$pag = $_GET['pag'];
Notice: Undefined index: pag in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\data\localweb\malcoln\galeria1.php on line 149
echo "<p>Resultados ".min($total, ($inicio + 1))." - ".min($total, ($inicio + $_BS['PorPagina']))." de ".$total." resultados encontrados para '".$_GET['pag']."'</p>";
Quando clico no número da página a consulta não está sendo realizada e mostra sempre as mesmas fotos da primeira página.
Alguma sugestão?
Pessoal, o problema agora se encontra apenas nessa linha que contém os números da página.
for($n = 1; $n <= $paginas; $n++) {
echo '<a href="?**consulta**='.$_GET['**consulta**'].'&pagina='.$n.'">'.$n.'</a> ';
}
Eu não terei um formulário de busca, Eu apenas clicarei no número de página e ele me dará o retorno com as imagens. Por isso retirei esse código:
$busca = $_GET['consulta'];
$busca = mysql_real_escape_string($busca);O problema que estava dando da variável pag eu resolvi colocando $pag=1; no código. Não sei se é a maneira correta de se fazer, mas parece que funcionou.
http://blog.thiagobelem.net/entendendo-a-paginacao-de-registros-no-mysql/
http://blog.thiagobelem.net/sistema-de-busca-em-php-e-mysql/