• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

diokhan

[Resolvido] Paginação PDO

14 mensagens neste tópico

boas,

sei que há no fórum paginações em php e assim, mas eu preciso que seja em PDO, é similar ao SQL. eu tentei usar uma paginação normal mas dá-me erros em:

$queryCount = 'SELECT count(*) FROM project';
$resultCount = mysql_query($queryCount); // linha 18
$fetch_row = mysql_fetch_row($resultCount); // linha 19
$numrows = $fetch_row[0];

e da sempre estes erros nessas linhas:

Warning: mysql_query() [function.mysql-query]: Access denied for user 'SYSTEM'@'localhost' (using password: YES) in......\page.php on line 18

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in .....\page.php on line 18

Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in ......\page.php on line 19

se alguém souber uma solução ou mesmo um código de paginação em PDO eu agradecia ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

resolvido  :)

quem quiser a soluçao digam que eu coloco aqui o codigo  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloca. É esse o espírito comunitário, deixar as questões resolvidas para quem procurar pela mesma dúvida encontra uma solução. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu amanha logo pela manha coloco aqui o codigo e explico como funciona..eu ajudo sempre que puder, no que eu souber eu ajudo..acho que dividir conhecimentos é sempre bom, porque tanto aprendemos algo novo como ajudamos alguem a aprender :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para fazer a paginaçao em pdo precisamos de criar um ficheiro a qual podemos chamar "page.php", o conteudo sera este:

<?php

error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);

defined('DSN') or define('DSN', 'mysql:host=localhost;dbname=dbname'); // trocar pelo nome da base de dados (*)
defined('USUARIO') or define('USUARIO', 'username'); // trocar pelo user (*)
defined('SENHA') or define('SENHA', 'password'); // trocar pela password (*)


class Paginacao_PDO
{
   public $paginador = 'pag';   
   private $solicitador;
   public $sql;
   public $limite = 5; // numero de registos que vao aparecer por pagina (*)
   public $quantidade = 10;

   // Construtor carrega a string usada para como paginador
   public function __construct()
   {
       $this->solicitador = $_REQUEST["{$this->paginador}"];       
   }
   // Conexao privada
   private function conexao()
   {
       $conexao = new Conexao();
       $con = $conexao->conexao;
       return $con;
   }
   // Retorna o numero de resultados encontrados   
   public function resultado()
   {
       $this->resultado = $this->conexao()->query(str_replace('*', 'COUNT(*)', $this->sql));
       $this->numeroResultados = $this->resultado->fetchColumn();
       return $this->numeroResultados;
   }

   public function paginasTotais()
   {       
       $paginasTotais = ceil($this->resultado() / $this->limite);
       return $paginasTotais;
   }
   // Procura o numero da pagina Atual
   public function paginaAtual()
   {
       if (isset($this->solicitador) && is_numeric($this->solicitador)) {         
           $this->paginaAtual = (int) $this->solicitador;
       } else {
           $this->paginaAtual = 1;
       }

       if ($this->paginaAtual > $this->paginasTotais()) {
           $this->paginaAtual = $this->paginasTotais();
       }

       if ($this->paginaAtual < 1) {
           $this->paginaAtual = 1;
       }

       return $this->paginaAtual;

   }
   // Calcula o offset da consulta
   private function offset()
   {
       $offset = ($this->paginaAtual() - 1) * $this->limite;   
       return $offset;
   }
   // Retorna o SQL para trabalhar posteriormente
   public function sql()
   {
       $sql = $this->sql .  " LIMIT {$this->limite} OFFSET {$this->offset()} ";
       return $sql;
   }
   // Imprime a barra de navegaçao da paginaçao
   public function imprimeBarraNavegacao()
   {
       if($this->resultado() > 0) {       
           echo '<div class="pagination" align=center>';
           if ($this->paginaAtual() > 1) {
               echo " <a href='?" . $this->paginador . "=1"  . $this->reconstruiQueryString($this->paginador) . "'>First</a> ";
               $anterior = $this->paginaAtual() - 1;
               echo " <a href='?" . $this->paginador . "=" . $anterior . $this->reconstruiQueryString($this->paginador) . "'>Previous</a> ";
           }

           for ($x = ($this->paginaAtual() - $this->quantidade); $x < (($this->paginaAtual() + $this->quantidade) + 1); $x++) {
               if (($x > 0) && ($x <= $this->paginasTotais())) {
                   if ($x == $this->paginaAtual()) {
                       echo " [<b>$x</b>] ";
                   } else {
                       echo " <a href='?" . $this->paginador . "=" . $x . $this->reconstruiQueryString($this->paginador) . "'>$x</a> ";
                   }
               }
           }

           if ($this->paginaAtual() != $this->paginasTotais()) {
               $paginaProxima = $this->paginaAtual() + 1;
               echo " <a href='?" . $this->paginador . "=" . $paginaProxima . $this->reconstruiQueryString($this->paginador) . "'>Next</a> ";
               echo " <a href='?" . $this->paginador . "=" . $this->paginasTotais() . $this->reconstruiQueryString($this->paginador) . "'>Last</a> ";
           }

           echo '</div>';           
       }   
   }
   // Monta os valores da Query String novamente
   public function reconstruiQueryString($valoresQueryString) {
       if (!empty($_SERVER['QUERY_STRING'])) {
           $partes = explode("&", $_SERVER['QUERY_STRING']);
           $novasPartes = array();
           foreach ($partes as $val) {
               if (stristr($val, $valoresQueryString) == false)  {
                   array_push($novasPartes, $val);
               }
           }
           if (count($novasPartes) != 0) {
               $queryString = "&".implode("&", $novasPartes);
           } else {
               return false;
           }
           return $queryString; // nova string criada
       } else {
           return false;
       }
   }   

}
// Voce pode criar outra forma de conexao se desejar
class Conexao
{
   private $_usuario;
   private $_senha;
   private $_dsn;

   public function __construct()
   {
       $this->defineUsuario(USUARIO);
       $this->defineSenha(SENHA);
       $this->defineDSN(DSN);   
       $this->abreConexao();
   }
   // Define o Usuario
   public function defineUsuario($usuario)
   {
       $this->_usuario = $usuario;
   }
   // Define a Senha       
   public function defineSenha($senha)
   {
       $this->_senha = $senha;
   }
   // Define o DSN       
   public function defineDSN($dns)
   {
       $this->_dsn = $dns;
   }
   // Abre a conexao sem retornar a mesma
   public function abreConexao()
   {
       $this->conexao = new PDO($this->_dsn, $this->_usuario, $this->_senha);
       $this->conexao->query("SET NAMES utf8");
   }
   // Fecha a conexao
   public function fechaConexao()
   {
       $this->_conexao = null;
   }
}

?>

so os campos assinalados por (*) que sao precisos ser alterados neste ficheiro.

depois nos ficheiros a qual queremos fazer a paginaçao colocamos estas linhas de codigo:

<?php
require_once ('../page.php');
...
echo'<table class="tabela">';

algum codigo para construir a tabela para mostrar dados, aqui fica a 1ª linha com os titulos

$conexao = new Conexao();
	$conexao = $conexao->conexao;

	$paginacao = new Paginacao_PDO();
	$paginacao->sql = "SELECT * FROM project ORDER BY ID_PROJECT ASC"; // fazer a vossa query aqui

	$res = $conexao->query($paginacao->sql());

	while($r = $res->fetch(PDO::FETCH_OBJ)) {

       echo '<tr>
       	<td>';
       		print $r->campo1; // alterar os campos para os campos que quiserem da vossa tabela
       	echo'</td>
       	<td>';
       		print $r->campo2; // alterar os campos para os campos que quiserem da vossa tabela
       	echo'</td>';
...
echo "</table>";

depois de fechada a tabela para inserir todos os resultados acrescentar esta linha:

$paginacao->imprimeBarraNavegacao(); // atençao..esta linha fica fora do 'echo'!!!!

espero poder ajuda..qualquer duvida é so dizer :thumbsup:

1

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá a todos!

Sou do Brasil e novo neste fórum. Esta foi a única solução de paginação que funcionou para mim, porém em partes.

Apesar do tópico ser antigo, gostaria de tirar uma dúvida.

Quando abro a página que tem os dados a serem paginados, a seguinte mensagem é exibida:

Notice: Undefined index: pag in ..\paginator.php on line 21

A url tem a seguinte aparência

http://www.meusite.com/index.php?go=category&id=4

Entretanto, quando coloco o rato sobre os links da paginação, a url tem esta aparência:

http://www.meusite.com/index.php?pag=1&go=category&id=4

quando deveria ser

http://www.meusite.com/index.php?go=category&id=4&pag=1

O link de chamada para a página que contém os registros a serem paginados é semelhante a este:

<a href="index.php?go=category&id=<?=$row['id_category']?>">

Alguém poderia me ajudar?

Desde já muito agradecido!

Editado por julioaze
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes colocar aqui o código que estás a usar?

Penso que o problema esteja no facto do URL não definir o parâmetro pag, pelo que deve ser suficiente colocar um if a definir um valor por omissão. Mas vendo é código é mais fácil de ajudar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes colocar aqui o código que estás a usar?

Penso que o problema esteja no facto do URL não definir o parâmetro pag, pelo que deve ser suficiente colocar um if a definir um valor por omissão. Mas vendo é código é mais fácil de ajudar.

Rui Carlos,

o código da paginação é este mesmo acima e o código que chama a página dos produtos a serem paginados segue abaixo:

<?php
try{
    $conn->beginTransaction();
    //$query = "select c1.*, c2.id_category, c2.c_nome from tb_store c1 left join tb_category c2 on (c2.id_category=c1.id_category) group by c2.id_category";
    $query = "SELECT * FROM tb_category where id_sub !=0 and c_tabela='tb_store'";
    foreach ($conn->query($query) as $row){
    ?>

    <li style="border-top:1px solid #ececec;"><a href="index.php?go=category&id=<?=$row['id_category']?>"><img src="thumb/thumb.php?file=../uploads/cat/<?=$row['c_imagem']?>&largura=213&altura=148" alt="img"><h5><?=$row['c_nome']?></h5></a></li><?php
    }
    $conn->commit();
}catch(PDOException $e){
    echo $e->getMessage();
}
?>

Quando abre a página dos produtos a serem paginados, os produtos são listados, mas aparece a seguinte mensagem

Notice: Undefined index: pag in ..\paginator.php on line 21

Na página dos produtos aparece o link de paginação, mas se clicar nada acontece porque me parece que a ordem das variaveis está trocada, como postei acima.

Segue o código da página de produtos

<?php

    try
    {
    $id = $_GET['id'];
    $pag = 1;
    $conexao = new Conexao();
    $conexao = $conexao->conexao;

    $paginacao = new Paginacao_PDO();
    $paginacao->sql = "SELECT * FROM tb_store where id_category = ".$id." order by id_store desc";

    $res = $conn->query($paginacao->sql());

    $i=1;
    while($row = $res->fetch(PDO::FETCH_OBJ)) {
    $promocao = Valor($row->promo);
    $preco = Valor($row->preco);
    ?>
    <div class="row-fluid">
    <div class="<?php echo ($i==1) ? "cart-products v2 first" : "cart-products v2";?>">
        <div class="span3">
        <figure class="product-container">
        <img class="h-align" src="thumb/thumb.php?file=../uploads/store/<?=$row->imagem?>&medida=135" />
        </figure>
        </div> <!--end span2-->
        <div class="span6">
        <div class="product-desc-text">
        <h4 class="product-description title v2"><?=$row->nome_produto?></h4>
        <div class="row-fluid">
            <div class="span12">
            <ul class="unstyled product-descriptions">
            <li><?php echo limit($row->descricao, 175)?></li>
            </ul>
            </div><!-- end span12 -->
        </div> <!--end row-fluid-->
        </div> <!--end product-dex-text-->
        </div> <!--end span5-->
        <div class="span3">
        <div class="product-total-container">
        <h5 class="product-total text-center"><?php echo ($promocao > 0) ? $promocao : $preco; ?></h5>
        <a href="index.php?go=storedetail&id=<?php echo base64_encode($row->id_store)?>" class="btn-success btn-large">Ver</a>
        </div> <!--end product-total-container-->
        </div> <!--end span2-->
    </div> <!--end cart-products-->
    </div> <!--end row-fluid-->
    <?php
    $i++;
    }

    }
    catch(PDOException $e) {
    echo 'ERRO: ' . $e->getMessage();
    }
    ?>

E mais abaixo chamo o links de navegação

<?php
$paginacao->imprimeBarraNavegacao();
?>

Tudo funciona bem, a não ser os links de navegação. Se digito manualmente no navegador tudo funciona, o que me leva a crer que a ordem realmente está errada

index.php?go=category&id=6&pag=2 // como deve ser
index.php?pag=2&go=category&id=6 //como está nos links de navegação

obrigado

Editado por Rui Carlos
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que o problema está aqui:

    public function __construct()
   {
       $this->solicitador = $_REQUEST["{$this->paginador}"];      
   }

Originalmente estás a usar o link http://www.meusite.com/index.php?go=category&id=4, que não define nenhum valor para o parâmetro pag, ao qual tentas aceder no código que mostro em cima.

Tens pelo menos duas hipóteses para resolver o problema:

1) Alterar o link inicial para http://www.meusite.com/index.php?go=category&id=4&pag=1

2) Alterar o código para definir um valor por omissão, o que devia ficar algo do género:

    public function __construct()
   {
       if(isset($_REQUEST[$this->paginador])) {
           $this->solicitador = $_REQUEST[$this->paginador];
       }
       else {
           // se o parametro nao esta definido, atribui um valor por omissao
           $this->solicitador = 1;
       }
   }

Tal como o nelsonr referiu, também me parece que a ordem dos parâmetros no URL é irrelevante.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela resposta Rui Carlos,

O problema do parâmetro era realmente porque estava vazio, mas a ordem dos parâmetros na URL ainda continua sendo um problema, pois ao aceder o link da paginação nada acontece. Já se eu coloco o link manualmente no navegador com o parâmetro 'pag' no final, tudo funciona bem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz outro teste e descobri que a ordem realmente não importa. O que não funciona é o click nos links de paginação, já que inserindo o URL diretamente na barra de endereço do navegador, não importando a ordem, sempre funciona, mas no click do link não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Problema resolvido. Existia uma classe na div que recebe a paginação que impedia o click nos links.

if($this->resultado() > 0) {	   
	    echo '<div class="pagination" align=center>';

Esta classe estava em conflito com minha folha de estilos.

Obrigado a todos pelas dicas!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora