Jump to content

[Resolvido] Paginação PDO


diokhan
 Share

Recommended Posts

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 😉

...Join the dark side...and get a free cookie...

Link to comment
Share on other 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 👍

  • Vote 1

...Join the dark side...and get a free cookie...

Link to comment
Share on other 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!

Edited by julioaze
Link to comment
Share on other 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

Link to comment
Share on other 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.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.