Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard Blätterfunktion

 

Inhalte

Definition


In vielen Fällen soll der Inhalt einer Seite auf mehrere Seiten verteilt werden, beispielsweise bei einer Bildergalerie oder einem Gästebuch. Um dies zu ermöglichen wird eine Blätterfunktion eingesetzt.

Benötigte Informationen


Damit der Server „weiß“, welche Daten er ausliefern soll, müssen ihm folgende Informationen übermittelt werden:

LimitDie Anzahl der Einträge pro Seite.
OffsetDer Versatz, d.h. die Anzahl an Einträgen, die übersprungen werden.
Um den letztgenannten Versatz zu errechnen, wird dieser entweder direkt übergeben, oder (schöner) aus der Seitenzahl errechnet.
Code:
Offset = (Seite – 1) * Limit


Anwendung


MySQL


In der Limit-Klausel der Abfrage kann auch der Versatz mit angegeben werden, was dem Programmierer Arbeit erspart.

Code:
SELECT `name`, `inhalt`
FROM   `gaestebuch`
LIMIT Offset, Limit;


Oder auch:

Code:
SELECT `name`, `inhalt`
FROM `gaestebuch`
LIMIT Limit, OFFSET Offset;


Arrays


Bei Arrays (z.B. der Inhalt einer Datei) ist das Auslesen der Daten weniger ressourcenfreundlich, weil das komplette Array eingelesen werden muss, bevor die relevanten Teile identifiziert werden können.
PHP Quellcode:
$relevant = array_slice($array, $offset, $limit);


Beispiele


Im Folgenden wird davon ausgegangen, dass die aktuelle Seite als Get-Parameter ($page) übergeben wird und es wird eine prozedural, sowie eine Objekt orientiert programmierte Variante vorgestellt.

Prozedural


PHP Quellcode:
// Variablen initialisieren

// Limit
$limit   = 2;
// Versatz
$offset  = 0;
// Aktuelle Seite
$curPage = 1;
// Gesammtanzahl der Einträge
$entries = 0;
// Anzahl der Seiten
$pages   = 0;


MySQL
PHP Quellcode:
// Datenbeschaffung

$sql = 'SELECT COUNT(*)
        FROM `gaestebuch`;'
;
$result = mysqli_query($db, $sql) OR die(mysqli_error($db));
$entries = mysqli_fetch_row($result)[0];

// Aufrunden, damit auch die letzte Seite Einträge enthält
$pages = ceil($entries / $limit);

if (isset($_GET['page']) && $_GET['page'] > 0) {
    if ($_GET['page'] > $pages) {
        $_GET['page'] = $pages;
    }
    $curPage = $_GET['page'];
    $offset  = ($curPage - 1) * $limit;
}

$sql = 'SELECT `name`, `inhalt`
        FROM `gaestebuch`
        LIMIT '
. (int) $offset . ', ' . (int) $limit . ';';
$result = mysqli_query($db, $sql) OR die(mysqli_error($db));


// Ausgabe
while ($row = mysqli_fetch_assoc($result)) {
    echo 'Name: ' . $row['name'] . '<br />';
    echo 'Inhalt ' . $row['inhalt'] . '<br />';
}


Arrays
PHP Quellcode:
// Datenbeschaffung

$array = array_fill(0, 5, array('name' => 'Max Mustermann', 'inhalt' => 'Musterinhalt'));

$entries = count($array);

// Aufrunden, damit auch die letzte Seite Einträge enthält
$pages = ceil($entries / $limit);

if (isset($_GET['page']) && $_GET['page'] > 0) {
    if ($_GET['page'] > $pages) {
        $_GET['page'] = $pages;
    }
    $curPage = $_GET['page'];
    $offset  = ($curPage - 1) * $limit;
}

$relevant = array_slice($array, $offset, $limit);

// Ausgabe
foreach ($relevant as $row) {
    echo 'Name: ' . $row['name'] . '<br />';
    echo 'Inhalt ' . $row['inhalt'] . '<br />';
}


PHP Quellcode:
// Seitenauswahl
echo 'Seitenauswahl: ';
for ($i = 1; $i <= $pages; $i++) {
    if ($curPage == $i) {
        echo $i . ' ';
    } else {
        echo "<a href=\"?page=$i\">$i</a> ";
    }
}


Objekt Orientiert


Bei denjenigen, die gerne mit Klassen arbeiten könnte es so aussehen:
PHP Quellcode:
/**
 * A class to help navigating between the pages of splitted content.
 *
 */

class PageBrowser
{
    /**
     * The number of entries which are displayed on each page.
     *
     * @var int
     */

    protected $_limit;
   
    /**
     * The number of the page the client is currently surfing on.
     *
     * @var int
     */

    protected $_page;
   
    /**
     * The entire number of entries.
     *
     * @var int
     */

    protected $_entryNumber;
   
    /**
     * The input array of which the needed parts will be selected.
     *
     * @var array
     */

    protected $_input;
   
   
    /**
     * Sets up limit, number of entries and the current page.
     *
     * @param int $limit
     * @param int $entryNumber
     * @param int $page
     */

    public function __construct($limit = null, $entryNumber = null, $page = null)
    {
        if (null !== $limit) {
            $this->setLimit($limit);
        }
        if (null !== $entryNumber) {
            $this->setEntryNumber($entryNumber);
        }
        if (null !== $page) {
            $this->setPage($page);
        }
    }
   
   
    /**
     * Sets the number of entries which are displayed on each page.
     *
     * @param int $limit
     * @return PageBrowser
     */

    public function setLimit($limit)
    {
        $this->_limit = (int) $limit;
        return $this;
    }
   
    /**
     * Sets the number of the page the client is currently surfing on.
     *
     * @param int $page
     * @throws Exception
     * @return PageBrowser
     */

    public function setPage($page)
    {
        if (null === $this->_entryNumber || null === $this->_limit) {
            throw new Exception('Number of entries and limit must be committed first.');
        }
       
        if (0 > $page) {
            $page = 1;
        } elseif ($this->getPageNumber() < $page) {
            $page = $this->getPageNumber();
        }
       
        $this->_page = (int) $page;
       
        return $this;
    }
   
    /**
     * Sets the entire number of entries.
     *
     * @param int $number
     * @return PageBrowser
     */

    public function setEntryNumber($number)
    {
        $this->_entryNumber = (int) $number;
        return $this;
    }
   
    /**
     * Sets the input array of which the needed parts will be selected.
     *
     * @param array $input
     * @return PageBrowser
     */

    public function setInput(array $input)
    {
        $this->_input = array_values($input);
        return $this;
    }
   
   
    /**
     * Gets the (correct) page the client is currently surfing on.
     *
     * @return int
     */

    public function getPage()
    {
        return $this->_page;
    }
   
    /**
     * Gets the number of available pages.
     *
     * @throws Exception
     * @return int
     */

    public function getPageNumber()
    {
        if (null === $this->_entryNumber || null === $this->_limit) {
            throw new Exception('Number of entries and limit must be commited first.');
        }
       
        return ceil($this->_entryNumber / $this->_limit);
    }
   
    /**
     * Gets the needed parts of the input array.
     *
     * @throws Exception
     * @return array
     */

    public function getOutput()
    {
        if (null === $this->_input) {
            throw new Exception('An input must be committed first.');
        }
       
        if (null === $this->_page || null === $this->_limit) {
            throw new Exception('Page and limit must be committed first.');
        }
       
        $offset = ($this->_page - 1) * $this->_limit;
       
        return array_slice($this->_input, $offset, $this->_limit);
    }
}


PHP Quellcode:
// Variablen initialisieren

// Limit
$limit   = 2;
// Aktuelle Seite
$curPage = isset($_GET['page']) ? $_GET['page'] : 1;
// Gesammtanzahl der Einträge
$entries = 0;

// Klasse instanzieren
require_once 'PageBrowser.php';
$pageBrowser = new PageBrowser();
$pageBrowser->setLimit($limit);


MySQL
PHP Quellcode:
// Datenbeschaffung

$sql = 'SELECT `name`, `inhalt`
        FROM `gaestebuch`;'
;
$result = mysqli_query($db, $sql) OR die(mysqli_error($db));

$array = array();
// Falls mit einer DB-Klasse gearbeitet wird, wäre die Methode fetchAll() sinnvoll
while ($row = mysqli_fetch_assoc($result)) {
    $array[] = array('name' => $row['name'], 'inhalt' => $row['inhalt']);
}

$entries = count($array);

$pageBrowser->setEntryNumber($entries)
            ->setPage($curPage)
            ->setInput($array);


Arrays
PHP Quellcode:
// Datenbeschaffung

$array = array_fill(0, 5, array('name' => 'Max Mustermann', 'inhalt' => 'Musterinhalt'));

$entries = count($array);

$pageBrowser->setEntryNumber($entries)
            ->setPage($curPage)
            ->setInput($array);



PHP Quellcode:
// Ausgabe
foreach ($pageBrowser->getOutput() as $row) {
    echo 'Name: ' . $row['name'] . '<br />';
    echo 'Inhalt ' . $row['inhalt'] . '<br />';
}


// Seitenauswahl
echo 'Seitenauswahl: ';
for ($i = 1; $i <= $pageBrowser->getPageNumber(); $i++) {
    if ($pageBrowser->getPage() == $i) {
        echo $i . ' ';
    } else {
        echo '<a href="?page='.$i.'">'.$i.'</a>';
    }
}


Erstellt von Helmchen, 07.02.2008 am 19:16
Zuletzt bearbeitet von hellbringer, 20.06.2014 am 10:55
0 Kommentare , 8648 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
blätterfunktion, pager

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Blätterfunktion Krueschi PHP 9 05.02.2008 11:18
Blätterfunktion... Honky99 PHP 20 11.01.2008 19:27
Blätterfunktion Chrescht PHP 6 04.07.2005 19:31
Blätterfunktion imported_PHP_Anfänger PHP 2 12.06.2005 10:28
Blätterfunktion Lollo PHP 4 10.05.2004 19:58


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:37 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC