Paginazione dei dati di phpnews.it

Salve, sto provando ad usare la paginazione dei dati dell'articolo:

http://www.phpnews.it/articoli/paginazione-dei-dati/

con delle mie classi, solo che quando non ci sono articoli come questo momento ,

mi salta l'errore che vi posto in fondo.

Queste sono le pagine:

index.php

<?php require_once(dirname(__FILE__) . '/../inc.php');
require_once(dirname(__FILE__) . '/../template/header.php'); 

   $db = new DbConnector();
   $db->connect();

$righe_per_pagina = 1;
$url_base = "index.php";
$pagine_vicine = 1;


// ----------------------------------------------------------------
//    C A L C O L O   D E L   N U M E R O   D I   P A G I N E
 
// ricavo il numero totale di record
$query = "SELECT COUNT(*) FROM articoli";
$result = mysql_query($query);
// record complessivi
$tot_righe = mysql_result($result,0);
// totale pagine
$tot_pagine = ceil($tot_righe / $righe_per_pagina);

// ----------------------------------------------------------------
//                 P A G I N A   C O R R E N T E

$pagina_corrente = isset($_GET['pag']) ? (int)$_GET['pag'] : 1;

// se la pagina corrente è minore di 1
if($pagina_corrente < 1)  {
    header('location: ' . $url_base);
    
}else if($pagina_corrente > $tot_pagine) {
    header('location: ' . crea_url($url_base, $tot_pagine));
    
}else
{

// ----------------------------------------------------------------
//            E S T R A Z I O N E   D E I   R E C O R D

// calcolo la prima riga da estrarre con la query
$prima_riga = ($pagina_corrente - 1) * $righe_per_pagina;

$query = "SELECT *
          FROM articoli
         LIMIT $prima_riga, $righe_per_pagina";

$result = $db->query($query);
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}



$elenco_articoli = array();
while ($row = mysql_fetch_assoc($result)) {
    $elenco_articoli[] = $row;
}

// creazione dei link di paginazione
$link_paginazione = paginazione($tot_pagine, $url_base, $pagina_corrente, $pagine_vicine);

// carico il template HTML
include 'index.html';
}
?>

e il suo file html:

<?php foreach($elenco_articoli as $riga):?>
<div class="post">
            <h2 class="title"><a href="#"><?php echo $riga["art_titolo"]; ?></a></h2>
            <p class="meta"><span class="date"><?php echo $riga["art_data"]; ?></span><span class="posted">Posted by <a href="#"><?php echo $riga["art_autore"]; ?></a></span></p>
            <div style="clear: both;">&nbsp;</div>
            <div class="entry">
            <?php echo $riga["art_articolo"]; ?>
         </div>
         </div>
         <p><?php echo $link_paginazione?></p>
 <?php endforeach ?>

Mi sapete dire come mai mi da questo warring:

Warning: Cannot modify header information - headers already sent by (output started at D:\wwwroot\wwwnet\template\header.php:15) in D:\wwwroot\wwwnet\home\index.php on line 33

inviato 6 anni fa
luigi
X 0 X

Ho scoperto che lo fa solo se non ci sono record nel db.

Come posso risolvere ?

grazie.

risposto 6 anni fa
luigi
X 0 X

il codice corretto: solo che manca il controllo se il db è vuoto:

<?php require_once(dirname(__FILE__) . '/../inc.php');
require_once(dirname(__FILE__) . '/../template/header.php'); 

   $db = new DbConnector();
   $db->connect();

$righe_per_pagina = 10;
$url_base = "index.php";
$pagine_vicine = 1;


// ----------------------------------------------------------------
//    C A L C O L O   D E L   N U M E R O   D I   P A G I N E
 
// ricavo il numero totale di record
$query = "SELECT COUNT(*) FROM articoli";
$result = $db->query($query);
// record complessivi
$tot_righe = mysql_result($result,0);
// totale pagine
$tot_pagine = ceil($tot_righe / $righe_per_pagina);

// ----------------------------------------------------------------
//                 P A G I N A   C O R R E N T E

$pagina_corrente = isset($_GET['pag']) ? (int)$_GET['pag'] : 1;

// se la pagina corrente è minore di 1
if($pagina_corrente < 1)  {
    header('location: ' . $url_base);
    
}else if($pagina_corrente > $tot_pagine) {
    header('location: ' . crea_url($url_base, $tot_pagine));
    
}else
{

// ----------------------------------------------------------------
//            E S T R A Z I O N E   D E I   R E C O R D

// calcolo la prima riga da estrarre con la query
$prima_riga = ($pagina_corrente - 1) * $righe_per_pagina;

$query = "SELECT *
          FROM articoli
         LIMIT $prima_riga, $righe_per_pagina";

$result = $db->query($query);
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}





$elenco_articoli = array();
while ($row = mysql_fetch_assoc($result)) {
    $elenco_articoli[] = $row;
}

// creazione dei link di paginazione
$link_paginazione = paginazione($tot_pagine, $url_base, $pagina_corrente, $pagine_vicine);

// carico il template HTML
include 'index.html';
}
require_once(dirname(__FILE__) . '/../template/footer.php'); 
?>

Grazie.

risposto 6 anni fa
luigi
X 0 X

nessuno?  :)

risposto 6 anni fa
luigi
X 0 X

Ciao,

l'errore in questione è causato dal fatto che imposti un header() dopo che la tua pagina ha già mandato in output qualcosa, e nel tuo caso specifico, il problema potrebbe essere in questa porzione di codice:

...
$pagina_corrente = isset($_GET['pag']) ? (int)$_GET['pag'] : 1;

// se la pagina corrente è minore di 1
if($pagina_corrente < 1)  {
    header('location: ' . $url_base);
    
}else if($pagina_corrente > $tot_pagine) {
    header('location: ' . crea_url($url_base, $tot_pagine));
    
}else
{
...

Quando non hai record $tot_pagine assume valore 0 (zero) e $pagina_corrente, se $_GET['pag'] non è settato, assume valore 1 e proprio in questo frangente il tuo controller effettua un header('location: ' . $url_base), a tal proposito, precedentemente, hai incluso l'header del tuo template, si presume che quest'ultimo file stampi qualcosa.

Questo potrebbe essere il problema.

 ;)

risposto 6 anni fa
guidoch
modificato 6 anni fa
X 0 X

Ciao,

l'errore in questione è causato dal fatto che imposti un header() dopo che la tua pagina ha già mandato in output qualcosa, e nel tuo caso specifico, il problema potrebbe essere in questa porzione di codice:

...
$pagina_corrente = isset($_GET['pag']) ? (int)$_GET['pag'] : 1;

// se la pagina corrente è minore di 1
if($pagina_corrente < 1)  {
    header('location: ' . $url_base);
    
}else if($pagina_corrente > $tot_pagine) {
    header('location: ' . crea_url($url_base, $tot_pagine));
    
}else
{
...

Quando non hai record $tot_pagine assume valore 0 (zero) e $pagina_corrente, se $_GET['pag'] non è settato, assume valore 1 e proprio in questo frangente il tuo controller effettua un header('location: ' . $url_base), a tal proposito, precedentemente, hai incluso l'header del tuo template ( require_once(dirname(__FILE__) . '/../template/header.php'); ) che si presume stampi qualcosa.

Questo potrebbe essere il problema.

 ;)

Guarda che funziona tutto regolare e solo che quando non c'è niente da  quel piccolo avviso.

L'unico devo inserire questo codice:

if (mysql_num_rows($q) == 0) { 
 echo "Risultato non trovato"; }
else {
echo "Risultato trovato";
}

Per controllare i record se ci sono o no,

solo che  non so dove metterlo.

Grazie. :)

risposto 6 anni fa
luigi
X 0 X

nessuno?

risposto 6 anni fa
luigi
X 0 X

Evita di chiedere se non c'è nessuno!!!

E' irritante e inutile al fine di risolvere il tuo problema!!! Se continui vedrò di chiudere questa discussione.

Il warning che ottieni è molto eloquente. Come già ti è stato spiegato stai inviando un header dopo aver dato l'echo di qualcosa.

Ti invito a rileggere attentamente il suggerimento datoti da guidoch.

Inoltre:

L'unico devo inserire questo codice:

if (mysql_num_rows($q) == 0) { 
 echo "Risultato non trovato"; }
else {
echo "Risultato trovato";
}

Per controllare i record se ci sono o no,

solo che  non so dove metterlo.

Mi sembra ovvio che tu lo debba mettere dove credi che il tuo applicativo debba eseguire tale operazione.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ok, ma non so dove metterlo,

e scusate molto.

Percaso va messo prima del while, o va messo prima dove dice guidoch.

Grazie mille.

risposto 6 anni fa
luigi
X 0 X

Lo metti dove hai necessità di effettuare un controllo del genere.

Non hai creato te lo script di cui sopra scusa? Avrai una idea logica di come deve funzionare il tuo applicativo no?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Lo metti dove hai necessità di effettuare un controllo del genere.

Non hai creato te lo script di cui sopra scusa? Avrai una idea logica di come deve funzionare il tuo applicativo no?

Ciao, per caso dici questo script?

if (mysql_num_rows($q) == 0) { 
 echo "Risultato non trovato"; }
else {
echo "Risultato trovato";
}

No, non lo scritto io lo trovato nelle mie vecchie discussioni, solo che non avendo più codice vecchio per rottura hardisk ed non avendo nessuna  copia salvata, quel codice non so dove lo devo inserire in questo caso perchè nel mio post vecchio c'èra scritto che lo dovevo mettere prima del ciclo while .

Solo provando metterlo anche lì, mi salta sempre quell'avvisso.

scusa se non mi capisci.

Grazie mille, e buona serata.

risposto 6 anni fa
luigi
X 0 X
scusa se non mi capisci.

 :tichedoff:

Il discorso è che il codice che non sai dove inserire ha una funzione logica a dir poco banale: se il risultato della query $q passata a mysql_num_rows è uguale a zero (cioè non ci sono righe) stampa un messaggio, se no ne stampa un altro.

Non è un discorso: "dove metto questo codice". Il codice ha una funzione ben precisa. Sta al programmatore decidere dove queste operazioni devono essere eseguite all'interno dei propri script!

Se lo metti sopra il while avrai il codice eseguito prima dell'operazione del while, se lo metti dopo sarà eseguito dopo. Tutto dipende da cosa il calcolatore vuoi che esegua e faccia in determinate situazioni.

risposto 6 anni fa
Mario Santagiuliana
X 0 X
scusa se non mi capisci.

 :tichedoff:

Il discorso è che il codice che non sai dove inserire ha una funzione logica a dir poco banale: se il risultato della query $q passata a mysql_num_rows è uguale a zero (cioè non ci sono righe) stampa un messaggio, se no ne stampa un altro.

Non è un discorso: "dove metto questo codice". Il codice ha una funzione ben precisa. Sta al programmatore decidere dove queste operazioni devono essere eseguite all'interno dei propri script!

Se lo metti sopra il while avrai il codice eseguito prima dell'operazione del while, se lo metti dopo sarà eseguito dopo. Tutto dipende da cosa il calcolatore vuoi che esegua e faccia in determinate situazioni.

si , ma va bene, ma mi dici dove sto coso lo devo mettere?

perchè ho provato tutti i modi.

la template header.php non c'èntra nulla,

perchè io faccio cosi:

index.php:

<?php

session_start();

require_once(dirname(__FILE__) . '/../inc.php');

require_once(dirname(__FILE__) . '/../template/header.php');

?>

Eseguo codice o php o html

<?php

require_once(dirname(__FILE__) . '/../template/footer.php');

?>

Quindi non ha alcuni output.

Mi dici dove devo c*, metterlo.

Perchè ho provato tutti i modi.

?

Va bene.

Ti ringrazio molto.

risposto 6 anni fa
luigi
X 0 X
Mi dici dove devo c*, metterlo.

Discussione chiusa

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda