Paginazione dati

Ciao.

Girovagando per la rete non trovo altro che esempi di paginazione per ottenere una lista di risultati il pių delle volte da motori di ricerca in cui impostiamo i numeri di links che vogliamo visualizzare.

Come posso fare per ottenere la paginazione di una sola variabile $testo?

In pratica mi serve per tagliare su + pagine un testo che, essendo troppo lungo, andrebbe a spaccare la grafica.

Questo il codice da cui parto:

<?php

session_start ();

include("config/dbconnect.php");

$query = "select *, DATE_FORMAT(data, '%d.%m.%Y') as data2 FROM articoli where id='$id_articolo';";

$risultato = mysql_query($query,$db) or die ("impossibile leggere News".mysql_error());

while ($valori = mysql_fetch_array($risultato)) {

   $_GET['id'];

   //$id = $valori["id"]; 

   $titolo= $valori["titolo"];

   $testo = $valori["testo"];

   $autore = $valori["autore"];

   $urlargomentoa = $valori["urlargomentoa"];

   $argomentoa = $valori["argomentoa"];

   $urlargomentob = $valori["urlargomentob"];

   $argomentob = $valori["argomentob"];

   $data2 = $valori["data2"];

      

   echo"<b> $titolo </b>";

             echo" scritto da: $autore -:- in data $data2<br><br>";

             echo"$testo";      

      

             echo"<br><b>Argomenti correlati:</b>

             <a href=\"$urlargomentoa\">1. $argomentoa</a> -:-

             <a   href=\"$urlargomentob\">2. $argomentob</a>";

   

}

mysql_free_result ($risultato);

mysql_close($db);

   

?>

Grazie. :)

inviato 10 anni fa
kenzo2000
X 0 X

Per prima cosa devi trovare un criterio per dividere il testo in pių pagine. Potresti usare un approccio "automatico" fissando il numero di caratteri massimo che una pagina deve avere. Qui trovi uno script che fa una cosa simile:

http://www.phpnews.it/content/view/149/86/

Oppure potresti indicare personalmente la fine di una pagina inserendo nel testo dei "segnaposto" del tipo {finepagina} e poi quando vai a visualizzare la pagina ti basta usare un explode() per ottenere le diverse pagine in un array.

A questo punto devi visualizzare la pagina richiesta. Per capire quale pagina visualizzare si procede creando dei link del tipo mostra_news.php?pag=1 e prelevare il numero di pagina da $_GET["pag"]

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni, grazie.

Ho inserito il codice del tutorial che mi hai indicato ed ottengo questo:

Fatal error: Call to undefined function: creaintro()

Potresti aiutarmi... non sono una cima in php.

risposto 10 anni fa
kenzo2000
X 0 X

Assicurati di aver riportato la funzione nel tuo codice e di richiamarla correttamente creaIntro

Tieni presente che quella funzione restituisce sono la prima parte di un testo, quindi la prima pagina, non i resto!

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Forse il problema č dato dal fatto che prendo il testo dal db?

<?php
session_start ();
include("config/dbconnect.php");

$query = "select *, DATE_FORMAT(data, '%d.%m.%Y') as data2 FROM articoli where id='$id_articolo';";
$risultato = mysql_query($query,$db) or die ("impossibile leggere News".mysql_error());

while ($valori = mysql_fetch_array($risultato)) {
   $_GET['id'];
   $titolo= $valori["titolo"];
   $testo = $valori["testo"];
   $autore = $valori["autore"];
   $urlargomentoa = $valori["urlargomentoa"];
   $argomentoa = $valori["argomentoa"];
   $urlargomentob = $valori["urlargomentob"];
   $argomentob = $valori["argomentob"];
   $data2 = $valori["data2"];
      
                echo"<b> $titolo </b>";
                echo" scritto da: $autore -:- in data $data2<br><br>";
             
                $frase = "$testo"; 

echo creaIntro($frase, 150); 

function creaIntro($frase,$numero_di_caratteri) 
{ 
    // cerco i punti in cui terminano le frasi 
    preg_match_all("/(\.\s)+/",$frase,$out,PREG_OFFSET_CAPTURE); 

    // cerco l'interruzione pių vicina a $numero_di_caratteri 
    $minima_distanza = strlen($frase); 
    $offset_minima_distanza = false; 

    foreach ($out[0] as $offset) { 
        $distanza = abs($numero_di_caratteri - $offset[1]); 
        if($distanza < $minima_distanza) { 
            $minima_distanza = $distanza; 
            $offset_minima_distanza = $offset[1]; 
        } 
    } 
     
    if($offset_minima_distanza) { 
        // restituisco l'introduzione some sottostringa 
        // di lunghezza $offset_minima_distanza + 1 
        echo substr($frase, 0, $offset_minima_distanza + 1); 
    } else { 
        // se non ho trovato una interruzione restituisco tutta la frase 
        echo $frase; 
    } 
} 
      
      
             echo"<br><b>Argomenti correlati:</b>
             <a href=\"$urlargomentoa\">1. $argomentoa</a> -:-
             <a   href=\"$urlargomentob\">2. $argomentob</a>";
   

}

mysql_free_result ($risultato);
mysql_close($db);
   
?>
risposto 10 anni fa
kenzo2000
X 0 X

togli dal ciclo while la dichiarazione della funzione creaIntro e mettila all'inizio (o alla fina, non ha importanza) dello script

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
togli dal ciclo while la dichiarazione della funzione creaIntro e mettila all'inizio (o alla fina, non ha importanza) dello script

Scusa  ma ho complete carenze anche di sintassi...  :'( ho fatto tatissimi tentativi... mah... intendi cosė?

<?php
session_start ();
include("config/dbconnect.php");

$query = "select *, DATE_FORMAT(data, '%d.%m.%Y') as data2 FROM articoli where id='$id_articolo';";
$risultato = mysql_query($query,$db) or die ("impossibile leggere News".mysql_error());

$frase = "$testo"; 

echo creaIntro($frase, 150); 

function creaIntro($frase,$numero_di_caratteri) 
{ 
    // cerco i punti in cui terminano le frasi 
    preg_match_all("/(\.\s)+/",$frase,$out,PREG_OFFSET_CAPTURE); 

    // cerco l'interruzione pių vicina a $numero_di_caratteri 
    $minima_distanza = strlen($frase); 
    $offset_minima_distanza = false; 

    foreach ($out[0] as $offset) { 
        $distanza = abs($numero_di_caratteri - $offset[1]); 
        if($distanza < $minima_distanza) { 
            $minima_distanza = $distanza; 
            $offset_minima_distanza = $offset[1]; 
        } 
    } 
     
    if($offset_minima_distanza) { 
        // restituisco l'introduzione some sottostringa 
        // di lunghezza $offset_minima_distanza + 1 
        echo substr($frase, 0, $offset_minima_distanza + 1); 
    } else { 
        // se non ho trovato una interruzione restituisco tutta la frase 
        echo $frase; 

while ($valori = mysql_fetch_array($risultato)) {
   $_GET['id'];
   //$id = $valori["id"]; 
   $titolo= $valori["titolo"];
   $testo = $valori["testo"]; // ------------->Questa dichiarazione non comporta problemi?
   $autore = $valori["autore"];
   $urlargomentoa = $valori["urlargomentoa"];
   $argomentoa = $valori["argomentoa"];
   $urlargomentob = $valori["urlargomentob"];
   $argomentob = $valori["argomentob"];
   $data2 = $valori["data2"];
      
   echo"<b> $titolo </b>";
             echo" scritto da: $autore -:- in data $data2<br><br>";
             echo"$testo";      
      
             echo"<br><b>Argomenti correlati:</b>
             <a href=\"$urlargomentoa\">1. $argomentoa</a> -:-
             <a   href=\"$urlargomentob\">2. $argomentob</a>";
   

}
   } 
      } 


mysql_free_result ($risultato);
mysql_close($db);
   
?>
risposto 10 anni fa
kenzo2000
X 0 X

Prova cosė:

<?php
session_start ();
include("config/dbconnect.php");

$query = "select *, DATE_FORMAT(data, '%d.%m.%Y') as data2 FROM articoli where id='$id_articolo';";
$risultato = mysql_query($query,$db) or die ("impossibile leggere News".mysql_error());

while ($valori = mysql_fetch_array($risultato)) {
   $_GET['id'];
   $titolo= $valori["titolo"];
   $testo = $valori["testo"];
   $autore = $valori["autore"];
   $urlargomentoa = $valori["urlargomentoa"];
   $argomentoa = $valori["argomentoa"];
   $urlargomentob = $valori["urlargomentob"];
   $argomentob = $valori["argomentob"];
   $data2 = $valori["data2"];
      
   echo"<b> $titolo </b>";
   echo" scritto da: $autore -:- in data $data2<br><br>";
   $frase = "$testo"; 

   echo creaIntro($frase, 150); 

   echo"<br><b>Argomenti correlati:</b>
             <a href=\"$urlargomentoa\">1. $argomentoa</a> -:-
             <a   href=\"$urlargomentob\">2. $argomentob</a>";
}

mysql_free_result ($risultato);
mysql_close($db);

// ---------------------------------------
function creaIntro($frase,$numero_di_caratteri) 
{ 
    // cerco i punti in cui terminano le frasi 
    preg_match_all("/(\.\s)+/",$frase,$out,PREG_OFFSET_CAPTURE); 

    // cerco l'interruzione pių vicina a $numero_di_caratteri 
    $minima_distanza = strlen($frase); 
    $offset_minima_distanza = false; 

    foreach ($out[0] as $offset) { 
        $distanza = abs($numero_di_caratteri - $offset[1]); 
        if($distanza < $minima_distanza) { 
            $minima_distanza = $distanza; 
            $offset_minima_distanza = $offset[1]; 
        } 
    } 
     
    if($offset_minima_distanza) { 
        // restituisco l'introduzione some sottostringa 
        // di lunghezza $offset_minima_distanza + 1 
        echo substr($frase, 0, $offset_minima_distanza + 1); 
    } else { 
        // se non ho trovato una interruzione restituisco tutta la frase 
        echo $frase; 
    } 
}
   
?>
risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Perfetto. GRAZIE! Ma non mi abbandonare proprio ora.  ::)

Praticamente ottengo il testo spezzato ad un punto che decide il codice attraverso questi criteri...

echo creaIntro($frase, 100);

e

preg_match_all("/(\.\s)+/",$frase,$out,PREG_OFFSET_CAPTURE);

giusto?

Riguardo a "/(\.\s)+/",, siccome non ottimizzano bene il mio testo in quanto taglia troppo prima o troppo dopo, come posso fare per adattarlo al meglio?

risposto 10 anni fa
kenzo2000
X 0 X

Quel codice cerca la fine della frase (cerca un punto ed uno spazio) pių vicina al limite imposto, indicato come il numero di caratteri (nell'esempio 150) dall'inizio del testo.

In questo modo le frasi non vengono interrotte dal taglio e vengono prese solo le prime frasi fino ad un totale di caratteri il pių vicino a quello fissato.

Quindi puoi solo modificare questo limite di caratteri per cambiare il comportamento dello script.

Oppure puoi decidere di tagliare le frasi in qualunque punto, magari alla fine di una parola, ma dovresti modificare l'espressione regolare e lo script potrebbe risultare particolarmente lento.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Chiarissimo... scusa per il ritardo nella risposta.

Lo script intanto non taglia il testo come dovrebbe. Sicuramente č un problema di formattazione che non riesco a modificare.

Praticamente con questo metodo taglia o troppo prima o troppo tardi anche se la variabile "echo creaIntro($frase, 100);" viene modificata di poco. Mi da l'impressione che non riconosce il 'punto e lo spazio'.

Come posso fare?

risposto 10 anni fa
kenzo2000
X 0 X

Mi sembra strano, infatti nell'estressione regolare i caratteri "\.\s" stanno proprio per punto e spazio  ???

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Allora, ho risolto il problema dell'interruzione modificando da "punto+spazio" a "a capo".

Ora mi restano due cose perō.

1.

L'editor che uso ad ogni mio 'invio' mette un <br />, codice che non riesco ad inserire perō nel codice

preg_match_all... ...

come fare? Se inserisco manulamente un '/n' sia nell'sql che nel 'preg_match_all' va tutto ok ma con il 'br' non ci riesco e siccome l'edito inserisce automaticamente br sarebbe un problema ogni volta convertirlo in /n.

2.

Come creo un menų per le pagine che seguono modello " 1 - 2 - 3"??

Grazie davvero!

risposto 10 anni fa
kenzo2000
X 0 X

Help me!  ::)

risposto 10 anni fa
kenzo2000
X 0 X

Partendo sempre dall'esempio mostrato qui:

http://www.phpnews.it/content/view/149/86/

l'espressione regolare questa volta diventa:

preg_match_all("^(\<br /\>)+^",$frase,$out,PREG_OFFSET_CAPTURE);

mentre per ottenere il testo fino all'interruzione trovata devi usare:

echo substr($frase, 0, $offset_minima_distanza);

Per il menu dell'articolo dipende da come dividi le pagine. Per prima cosa evi trovare il modo di ricavare il numero totale di pagine  :dunno:

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho quasi trascorso due mesi lontano da questo problema ed il tempo non mi ha dato alcun suggerimento.

Sono rimasto al numero totale di pagine, alla suddivisione in pagine del testo preso dal database...

Chi puō continuare ad aiutarmi?

risposto 10 anni fa
kenzo2000
X 0 X

up

risposto 10 anni fa
kenzo2000
X 0 X

Fai un riassunto della situazione attuale e di cosa non riesci ad implementare.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Praticamente la parte per il menų numerico...  :'(

bene o male riesco a dividere il testo per punteggiatura e parole ma non riesco ad ottenere il menų per dividere in pagine.

GRAZIE!

risposto 10 anni fa
kenzo2000
X 0 X

Vuoi creare un menu da mostrare in tutte le pagine con l'indice dell'articolo?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

No vorrei un menų sotto ogni pagina:

1  |  2  |  3  |  4 |

risposto 10 anni fa
kenzo2000
X 0 X

Dai unocchiata allo script di paginazione che ho proposto in questa discussione:

http://www.phpnews.it/forum/index.php?topic=57.msg255#msg255

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda