Paginazione dati PDO

DieciJack

Nuovo Utente
22 Feb 2015
13
0
0
Salve a tutti ragazzi, sto cercando di applicare la paginazione dei dati ad una query che estrae i dati dal DB. Purtroppo gli esempi on-line sono abbastanza obsoleti e mi viene difficile adattare il codice visto che attualmente sto utilizzando PDO per le operazioni con MySQL.

Ecco il codice:
PHP:
   	//PAGINAZIONE DATI 
	$count = 'SELECT id_articolo FROM `articoli`';
	$res = $pdo->query($count);
        $res_count = $res->fetch(PDO::FETCH_NUM);
	
	$tot_records = $res_count[0];
	$per_page = 10;
	
        $tot_pages = ceil($tot_records / $per_page);
	
	$current_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];
	
	$first = ($current_page - 1) * $per_page;

    // SELECT ELEMENTI 
    $sql = 'SELECT * FROM `articoli` ORDER BY `data_articolo` DESC LIMIT $first, $per_page';
    $result = $pdo->query($sql);

E poi tramite
PHP:
include("paginazione.php");
includo questo script:

PHP:
<?php

if($current_page == 1) { // se siamo nella prima pagina
$precedente = “<< precedente”;
} else { // altrimenti
$previous_page = ($current_page – 1);
$precedente = “<a href=\”?page=$previous_page\” title=\”Vai alla pagina precedente\”><< precedente</a>”;
}

if($current_page == $tot_pages) { // se siamo nell’ultima pagina
$successiva = “successiva >>”;
} else { // altrimenti
$next_page = ($current_page + 1);
$successiva = “<a href=\”?page=$next_page\” title=\”Vai alla pagina successiva\”>successiva >></a>”;
}
$paginazione = “$precedente   $successiva”;
?>

L'errore che ricevo è il seguente:

Notice: Undefined index: page in "..." on line 65

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1327 Undeclared variable: $first' in "...":71 Stack trace: #0 "..." (71): PDO->query('SELECT * FROM `...') #1 {main} thrown in "..." on line 71

Da quello che ho capito l'errore è nella variabile $current_page ma non riesco a trovare una soluzione, come posso risolvere? Grazie in anticipo.
 
Ciao, per il primo Notice modifica questa riga con isset()
PHP:
$current_page = !isset($_GET['page']) ? 1 : (int) $_GET['page'];
poi sistema gli apici della query
PHP:
// SELECT ELEMENTI 
$sql = "SELECT * FROM articoli ORDER BY data_articolo DESC LIMIT $first , $per_page";
 
Grazie adesso la query funziona correttamente, adesso però ho un problema con lo script della paginazione: utilizzando quello che ho inserito nel messaggio riscontro questo errore: Parse error: syntax error, unexpected '–' (T_STRING) on line 6

Con uno script differente, ossia questo:

PHP:
<?php

$paginazione = “Pagine totali: ” . $tot_pages . “
[";
for($i = 1; $i <= $tot_pages; $i++) {
if($i == $current_page) {
$paginazione .= $i . " ";
} else {
$paginazione .= "<a href=\"?page=$i\" title=\"Vai alla pagina $i\">$i</a> ";
}
}
$paginazione .= "]“;

L'errore che ricevo è il seguente:

PHP:
Parse error: syntax error, unexpected 'totali' (T_STRING) on line 2

Sembrano tutti errori di sintassi perciò ho provato a modificare gli apici di entrambi gli script senza però alcun risultato.
 
Usi degli apici strani ( “ )
che editor utilizzi ?
cmq cambiali con i doppi normali ( " )
 
Seguendo l'esempio di mrwebmaster: https://www.mrw.it/php/paginazione-dati-mysql_6871.html sono riuscito a risolvere.

Ecco il codice per la paginazione con PDO:
PHP:
   	//PAGINAZIONE DATI 
	
	$x_pag= 6;
	
	$pag = isset($_GET['page']) ? $_GET['page'] : 1;
	if (!$pag || !is_numeric($pag)) $pag = 1; 
	
	
	 $count = 'SELECT COUNT(id_articolo) FROM articoli';
     $res = $pdo->prepare($count);
     $res->execute();
     $res_count = $res->fetchColumn();
	 
	 $all_pages = ceil($res_count / $x_pag);
	 
	 $first = ($pag - 1) * $x_pag;

All'inizio ho provato con
PHP:
$count = 'SELECT id_articolo FROM articoli';
ma la query non riusciva a contare il numero di risultati.
Utilizzando
PHP:
$res_count = $res->fetch(PDO::FETCH_NUM);
l'errore che ricevevo è il seguente: Fatal error: Unsupported operand types probabilmente perchè anche quella stringa non contava con esattezza i risultati e non risuciva ad arrotondare con ceil in
PHP:
$all_pages = ceil($res_count / $x_pag);
Potrebbe esserci qualche problema di sicurezza con questo codice?
 
Fai il controllo sul parametro ricevuto per verificare che sia numerico, credo possa bastare
 
Fai il controllo sul parametro ricevuto per verificare che sia numerico, credo possa bastare

Grazie per la dritta, avrei un altra domanda da fare: ho provato ad inserire index.php?page=5,6,7,8 ecc. e ad ogni link visualizzo una pagina senza risultati, ma le pagine esistenti sono 4. C'è un modo per limitare solamente alle pagine esistenti? Ovvero se inserisco index.php?page=5 visualizzare un messaggio di errore come "La pagina non esiste."
 
puoi provare cosi
PHP:
if($pag > $all_pages) {
   $pag = $all_pages;
}
 

Discussioni simili