PHP: Classe Paginacao + Classe Conexao

Quem nunca se estressou na hora de fazer a paginação de um sistema web?

Livre-se dessa agonia, conheça minha classe de paginação.

Quem nunca se estressou na hora de fazer a paginação de um sistema web?

Realmente, é uma coisa que chega ser tão fácil, mas muita gente ainda não aprendeu muito sobre as paginações. Essa classe, irá te ajudar:

< ?php
/**
 * Manipuladora de paginação.
 *
 * Características:
 * - Controla a paginação de resultados;
 *
 * @since 28/02/09
 * @author Lucas Martins
 * @copyright Copyright (c) 2009, Lucas Martins
 * @version 1.0
 *
 * Displays GNU Public License
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */
class Paginacao extends Conexao {
	/**
	 * Query para pegar o número de linhas
	 * @var string $sql
	 */
	var $sql;
	/**
	 * Primeira página
	 * @var string $sql
	 */
	var $primeira;
	/**
	 * Última página
	 * @var string $sql
	 */
	var $ultima;
	/**
	 * Total do resultado da query
	 * @var string $sql
	 */
	var $total;
	/**
	 * A navegação da paginação
	 * @var string $sql
	 */
	var $paginas;
	/**
	 * Total de páginas
	 * @var string $sql
	 */
	var $totalPaginas;
	/**
	 * Construtor da classe Paginacao.
	 *
	 * @param string $sql Query para pegar o número de linhas
	 * @param string $link Link da página atual para páginação
	 * @param integer $pagina Página atual
	 * @param integer $linhasPorPaginas Quantidade de linhas por página
	 * @param integer $limitePaginas Limite de páginas na navegação da paginação
	 * @param string $parametros Parametros adicionais para o link
	 * @since 28/02/09
	 * @author Lucas Martins
	 * @return void
	 */
	function __construct($sql, $link, $pagina, $linhasPorPaginas = 10, $limitePaginas = 10, $parametros = '') {
		parent::Conecta();
		$result	= parent::Consulta($sql);
		$this->total = mysql_num_rows($result);
		$this->totalPaginas = ceil($this->total / $linhasPorPaginas);
		$pagina = intval($pagina);
		$linhasPorPaginas = intval($linhasPorPaginas);
		$limitePaginas = intval($limitePaginas);
		if (!is_int($linhasPorPaginas) || $linhasPorPaginas < 1) {
			$linhasPorPaginas = 10;
		}
		if (!is_int($limitePaginas) || $limitePaginas < 1) {
			$limitePaginas   = 10;
		}
		if ($pagina > $this->totalPaginas) {
			$pagina = $this->totalPaginas;
		}
		if (!is_int($pagina) || $pagina < 1) {
			$pagina = 1;
		}
		if ($this->totalPaginas > $limitePaginas) {
			$value = $limitePaginas;
		} else {
			$value = $this->totalPaginas;
		}
		$this->paginas = "";
		if($pagina > 1){
			$this->paginas .= "«";
		}
		$i = $pagina < = (intval($limitePaginas / 2) + 2) ? 1 : $pagina - intval($limitePaginas / 2);
		$value = $limitePaginas + $i;
		while ($i < $value) {
			if ($i == $pagina) {
				$this->paginas .= " $i";
			} else {
				if ($i < = $this->totalPaginas) {
					$this->paginas .= " ".$i."";
				}
			}
			$i++;
		}
		if ($pagina < = $this->totalPaginas) {
			if ($this->totalPaginas != $pagina) {
				$this->paginas .= " »";
			}
		}
		$this->primeira = (($pagina - 1) * $linhasPorPaginas) + 1;
		$this->sql = $sql." LIMIT ".(($pagina - 1) * $linhasPorPaginas).",".$linhasPorPaginas;
		if ($pagina == $this->totalPaginas) {
			$this->ultima = ($pagina - 1) * $linhasPorPaginas + ($this->total - (($pagina - 1) * $linhasPorPaginas));
		} else {
			$this->ultima = $pagina * $linhasPorPaginas;
		}
	}
	/**
	 * Destruidor da classe Paginação.
	 *
	 * @since 28/02/09
	 * @author Lucas Martins
	 * @return void
	 */
	function __destruct() {
		parent::Desconecta();
	}
}
?>

A classe de Conexão com o banco de dados MySQL:

< ?php
/**
 * classe CONEXAO, conexao.php
 * conecta com a base de dados
 *
 * @category classes
 *
 * @version 1.0
 * @since 09/10/2008  13:50
 * @author Lucas Martins
 * @copyright Copyright (c) 2009, Lucas Martins
 *
 * Displays GNU Public License
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
 */

class Conexao
{
    var $banco_bd = "lm_testes";
    var $usuario_bd = "root";
    var $senha_bd = "";
    var $ip_bd = "localhost";
    var $consulta = "";
    var $con = "";

    function __construct()
    {
        $this->Conecta();
    }

    function Conecta()
    {
        $this->con = mysql_connect($this->ip_bd, $this->usuario_bd, $this->senha_bd);

        if (!$this->con) {
            die("Problema na conexão com o Banco de Dados");
        } elseif (!mysql_select_db($this->banco_bd, $this->con)) {
            die("Problema na conexão com a Base de Dados");
        }
    }

    function Desconecta()
    {
        return mysql_close($this->con);
    }

    function Consulta($consulta)
    {
        $this->consulta = $consulta;
        if ($resultado = mysql_query($this->consulta, $this->con)) {
            return $resultado;
        } else {
            return 0;
        }
    }

    public function pegaErro()
    {
        return mysql_error($this->con);
    }

    public function pegaNumErro()
    {
        return mysql_errno($this->con);
    }

}
/**
 * Fim da Classe CONEXAO
 */
?>

Aí vai um exemplo de como utilizar esta classe:

< ?php
function __autoload($class) {
	require($class.".php");
}
$query = "SELECT code, country FROM tbl_country";
$obj_cnx = new Conexao;
$obj_cnx->Consulta($query);
$page = $_GET['page'];
// syntax: queryList( $sql, $link, $page, [$rowsPerPage [, $pageLimit ]])
$paginacao = new Paginacao($query, $_SERVER['PHP_SELF'].'?', $page);
$result = $obj_cnx->Consulta($paginacao->sql);
?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


		< ?php while (list($code, $country) = mysql_fetch_row($result)) { $numLinha += 1; ?>
		
		< ?php } ?>
	
Abrv. País País
< ?php echo $code; ?> < ?php echo $country; ?>
Resultado < ?php echo $paginacao->primeira; ?> - < ?php echo $paginacao->ultima; ?> de < ?php echo $paginacao->total; ?> (< ?php echo $paginacao->totalPaginas; ?> páginas) < ?php echo $paginacao->paginas; ?>

E é isso aê!

Caso haja melhorias, criticas, sugestões ou dúvidas, por favor, estou aguardando comentários…

…AH! E outra coisa, me desculpem pelos bugs do plugin WP-CODEBOX que estou utilizando, prometo tentar arrumar isso ae, apesar dele já estar atualizado.

Abraços!