Paginazione con pdo.

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
43
Massa, Italy
Salve, come mai mi dice sempre
PHP:
echo "Nessun dato Trovato!";
invece i dati ci sono?.
questa è la paginazione che usavo in mysqli e funziona molto bene ora la sto portando in pdo.
ma non so come mai mi dice sempre non trovato record.

PHP:
<?php
	class Paginazione
	{
		private $xpage = 0;
		private $tot = 0;

		private $totpag = 0;
		private $cpage = 0;
		private $query = "";
		private $record = array();
	
		public function Paginazione($query, $xpage, $varq)
		{
            global $db;
			// le rendo globali
			$this->xpage = $xpage;
			$this->varq = $varq;
			$this->query = trim($query);
			
			// pagina corrente sia get che post
			$this->cpage = (int)($varq)>0 ? (int)$varq : 1;
			// inizio record
			$inizio = $xpage * ($this->cpage - 1);
			
			// eseguo la query per contare i record
			$ct = $db->query($this->query) or die($db->error);
			
			$rows = $ct->fetchAll(); 
			$total_records = count($rows);
			// record totali
			$this->tot = $total_records = $ct->rowCount();
		                                           	
			// se ci sono record                                                      // DEVE ESSERE QUI IL PROBLEMA.. perché non so come fare.
			if($this->tot > 0)
			{
				// pagine totali
				$this->totpag = ceil($this->tot / $xpage);
				
				// scrivo ed eseguo la query mirata
				$target = " LIMIT " . $inizio . ", " . $xpage;
				$ex = $db->query($this->query . $target) or die($db->error);
				
				while($ft = $ex->fetch())
				{
					$record[] = $ft;
				}
				
				if(empty($record))
				{				
				
				}
				else
				{
				$this->record = $record;
				}
				
			}
			else
			{
				$this->record = array();
			}
		}
		
		public function Show()
		{
			if(count($this->record) > 0)
			{
				return $this->record;
			}
			else
			{
				return false;
			}
			
		}
		
		public function Link($nlink = 4)
		{
			$before = array();
			$after = array();
			
			if($this->cpage < $nlink)
			{
				$nlink *= 2;
				$nlink -= ($this->cpage - 1);
			}
			elseif($this->cpage > ($this->totpag - $nlink))
			{
				$nlink *= 2;
				$nlink -= ($this->totpag - $this->cpage);
			}
			
			
			
			for($i = $nlink; $i>=1; $i--)
			{
				if(($this->cpage - $i) >= 1)
				{
					$before[] = $this->cpage - $i;
				}
			}
			
			for($i = 1; $i<=$nlink; $i++)
			{
				if(($this->cpage + $i) <= $this->totpag)
				{
					$after[] = $this->cpage + $i;
				}
				
				if($this->cpage == $nlink)
					$nlink += 1;
			}
			
			$link["first"] = 1;
			$link["before"] = $before;
			$link["current"] = $this->cpage;
			$link["after"] = $after;
			$link["last"] = $this->totpag;
			
			if($this->cpage <= $this->totpag && $this->totpag > 1)
			{
				return $link;
			}
			else
			{
				return false;
			}
		}
	}
?>

e questo e il file da lanciare:
PHP:
<?php defined('ENGINE_BLOG') or die("Pagina non accessibile direttamente"); ?>
<?php
include("blog_include.php");
?>

<p class="ph1">Blog</p>
<br /> <br />
<div align="center">
<?php
try {
    $blog_categories = $db->prepare('SELECT * FROM blog_categories ORDER BY is_order ASC');
	$blog_categories->execute();
	
	
} catch (Exception $e) {
        die ($e);
    }
?><span style="color:red;">[&nbsp;&nbsp;<a href="blog.php">Vedi Tutto</a>&nbsp;&nbsp;]</span>
<?php	
while($row = $blog_categories->fetch())
//foreach($rowarray as $row)	
{
?>
 [&nbsp;&nbsp;<a href="blog.php?cat=<?php echo $row["id"]; ?>"><?php echo $row["categories"]; ?></a>&nbsp;&nbsp;]
<?php
}
?>

</div>
<br>
<?php
$cat = (isset($_GET['cat'])) ? trim((int)$_GET['cat']) : '';

$pagina = (isset($_GET["pagina"])) ? trim ((int)$_GET["pagina"]): '';

  $pag = new Paginazione("SELECT  blog_categories.categories as _cat , blog.* FROM blog 
       INNER JOIN blog_categories 
          ON blog_categories.id = blog.id_categories WHERE blog.is_public=1 ORDER BY data_reg DESC",1, $pagina);

if($record = $pag->Show())
{
	foreach($record as $row)
	{
?><div class="post">
<h2><?php echo $row["subject"]; ?></h2>
<div class="contents">
<?php echo bbcode_more(bbcode($row['content']), $row['id']); ?>	
</div>
<ul class="info">
<li><strong>Data:</strong>&nbsp;<?php echo data_it($row['data_reg']) ?>&nbsp;</li>
<li><strong>Categoria:</strong>&nbsp;<?php echo $row["_cat"]; ?>&nbsp;</li>
</ul>
</div>
<?php
}
}
	else
	{
		echo "Nessun dato Trovato!";
	}
// restituisce i link alle pagine
	if($link = $pag->Link(3))
	{
		?>
		<a href="?uid=<?php echo $uid; ?>&cat=<?php echo $cat; ?>&pagina=<?php echo $link['first']; ?>">&laquo;</a> <?php
			foreach($link['before'] as $bf)
			{
				?><a href="?uid=<?php echo $uid; ?>&cat=<?php echo $cat; ?>&pagina=<?php echo $bf;?>"><?php echo $bf;?></a> <?php
			}
			?><?php echo $link['current'];?> <?php
			foreach($link['after'] as $at)
			{
				?><a href="?uid=<?php echo $uid; ?>&cat=<?php echo $cat; ?>&pagina=<?php echo $at;?>"><?php echo $at;?></a> <?php
			}
		?><a href="?uid=<?php echo $uid; ?>&cat=<?php echo $cat; ?>&pagina=<?php echo $link['last'];?>">&raquo;</a>
		<?php
	}
$db = NULL;
?>
 
scusate, lascio perdere la mia ma ho trovato una classe.. ma non so come mai se metto la mia con inner join non fa più...

ecco il codice funzionante:
PHP:
$pages = new Paginator('1','p');

//get number of total records
$stmt = $db->query('SELECT count(id) FROM blog');
$row = $stmt->fetch(PDO::FETCH_NUM);
$total = $row[0];

//pass number of records to
$pages->set_total($total); 

$data = $db->query('SELECT * FROM blog '.$pages->get_limit());
foreach($data as $row) {
    //display the records here

?><div class="post">
<h2><?php echo $row["subject"]; ?></h2>
<div class="contents">
<?php echo bbcode_more(bbcode($row['content']), $row['id']); ?>	
</div>
<ul class="info">
<li><strong>Data:</strong>&nbsp;<?php echo data_it($row['data_reg']) ?>&nbsp;</li>
<li><strong>Categoria:</strong>&nbsp;<?php echo $row["_cat"]; ?>&nbsp;</li>
</ul>
</div>
<?php

}

link:
http://www.daveismyname.com/tutorials/php-tutorials/pagination-with-a-php-class/

link 2:
https://github.com/daveismyname/pagination

idee come fare?

grazie mille.
 
help.

$data = $db->query('SELECT blog_categories.categories as _cat,blog.* FROM blog INNER JOIN blog_categories
ON blog_categories.id = blog.id_categories WHERE blog.is_public=1 ORDER BY data_reg DESC'.$pages->get_limit());

se metto cosi ricevo errore:

Warning: Invalid argument supplied for foreach()
idee?
 
Ti sei dimenticato la clausola LIMIT:
PHP:
$data = $db->query('SELECT blog_categories.categories as _cat,blog.* FROM blog INNER JOIN blog_categories 
ON blog_categories.id = blog.id_categories WHERE blog.is_public=1 ORDER BY data_reg DESC LIMIT ' . $pages->get_limit());
E dovresti impostare PDO per lanciare un'eccezione quando una query fallisce, così puoi gestire gli errori in un blocco try/catch o in un gestore delle eccezioni.
 
ciao , ho messo quello che mi hai detto.. ma mi da il solito:
bool(false)
Warning: Invalid argument supplied for foreach()

ora ho messo anche var_dump e mi dice false.

come mai?

non supporta SQLitE?

PHP:
$data = $db->query('SELECT blog_categories.categories as _cat,blog.* FROM blog INNER JOIN blog_categories 
ON blog_categories.id = blog.id_categories WHERE blog.is_public=1 ORDER BY data_reg DESC LIMIT ' . $pages->get_limit()); 
		  
var_dump($data);
foreach($data as $row) {

idee?..

grazie mille.
 
ops... non so come mai ora funziona... forse ho messo male io page_limit..
non saprei ho copiato il codice tuo e messo nel mio ha funzionato.

ti ringrazio molto..alla prossima.
 
ultima cosa.. mi sai dire come faccio fare generare i link della paginazione:
ad questa righa di codice:
PHP:
echo $pages->page_links('?','&status='.$_GET['status'].'&active='.$_GET['active']);

il mio deve essere ?b=list_cat&cat=(numero)

non riesco a capire la guida.

hai idee?.
 
niente ho risolto.. vedendo bene gli esempi della guida..

poi ho messo il sito su altervista per non pagare più. e non aver problemi in quel servizio lì che ne hanno sempre una..
andava bene per imparare a programmare .. però dopo quando scade il dominio lo sposto su register se c'è la farò con i soldi.

vi ringrazio molto.. e buona serata.
 

Discussioni simili