Anzeige
Tutorialbeschreibung

PHP+MySqli Blätterklasse

PHP+MySqli Blätterklasse

Hier eine von mir entwickelte Blätterklasse.
Die Blätterklasse holt die Anzahl der Einträge von der gewünschten Tabelle per MySqli-Objekt und erzeugt eine Navigation.

Vorraussetzungen:
 - MySqli-fähiger Webspace o.Ä.
 - Grundkenntnisse in HTML, PHP und OOP.


Also hier als Erstes die blaettern.class.php:

<?php
class Blaettern
{
	public $startEntry;
	public $tableOffset;
	private $naviOffset;
	private $table;
	private $whereClause;
	private $currentPage;
	
	public function __construct($db, $table, $tableOffset, $naviOffset, $whereClause)
	{
		$this->setTable($table);
		$this->setWhereClause($whereClause);
		$this->setTableOffset($tableOffset);
		$this->setNaviOffset($naviOffset);
		$this->getCurrentPage();
		$this->countTableEntries($db);
		$this->calcTotalPages();
		$this->calcStartEntry();
	}
	
	private function setTable($table)
	{
		$this->table = $table;
	}
	
	private function setWhereClause($whereClause)
	{
		if(!isset($whereClause) or $whereClause == '')
		{
			$this->whereClause = '1=1'
		}
		else
		{
			$this->whereClause = $whereClause;
		}
	}
	
	private function setTableOffset($tableOffset)
	{
		$this->tableOffset = $tableOffset;
	}
	
	private function setNaviOffset($naviOffset)
	{
		$this->naviOffset = $naviOffset;
	}
	
	private function getCurrentPage()
	{
		$this->currentPage = @$_GET['page'];
		if (!isset($this->currentPage) or !is_numeric($this->currentPage))
		{
			$this->currentPage = 1;
		}
	}
	
	private function countTableEntries($db)
	{
		$sql = "SELECT id FROM $this->table WHERE $this->whereClause";
		$result = $db->query($sql);
		if($db->errno)
		{
			die('There was an error in MySqli: ' . $db->error);
			$db->close();
		}
		else
		{
			$num_rows = mysqli_num_rows($result);
			$this->tableEntries = $num_rows;
		}
	}
	
	private function calcTotalPages()
	{
		$this->totalPages = $this->tableEntries / $this->tableOffset;
		if($this->currentPage - 1 > $this->totalPages)
		{
			$this->currentPage = 1;
		}
	}
	
	private function calcStartEntry()
	{
		$this->startEntry = $this->currentPage * $this->tableOffset - $this->tableOffset;
	}
	
	public function navBar($s, $var='')
	{
		$navBar = '';
		$NavCeil = floor($this->naviOffset / 2);
		if($this->currentPage > 1)
		{
			$navBar .= '<a href="?s='.$s.$var.'&page=1">|<</a>&nbsp;';
			$navBar .= '<a href="?s='.$s.$var.'&page='.($this->currentPage-1).'"><</a>&nbsp;';
		}
		else
		{
			$navBar .= "|<&nbsp;";
			$navBar .= "<&nbsp;";
		}
		for ($x=$this->currentPage-$NavCeil;$x<=$this->currentPage+$NavCeil;$x++)
		{
			if (($x>0 && $x<$this->currentPage) || ($x>$this->currentPage && $x<=$this->totalPages))
			{
				$navBar .= '<a href="?s='.$s.$var.'&page='.$x.'">'.$x.'</a>&nbsp;';
			}
			if ($x==$this->currentPage)
			{
				$navBar .= '<b>' . $x . '</b>&nbsp;';
			}
		}
		if($this->currentPage < $this->totalPages)
		{
			$navBar .= '<a href="?s='.$s.$var.'&page='.($this->currentPage+1).'">></a>&nbsp;';
			$navBar .= '<a href="?s='.$s.$var.'&page='.ceil($this->totalPages).'">>|</a>&nbsp;';
		}
		else
		{
			$navBar .= ">&nbsp;";
			$navBar .= ">|&nbsp;";
		}
		return $navBar;
	} 
}
?>
Die blaettern.class.php wird dann in der gewünschten Datei eingebunden (require oder include)

Hier im Beispiel die news.php:

<?php
require 'mysqli.php';
require 'blaettern.class.php';

$blaettern = new blaettern($db, 'news', 5, 8, 'checked=1');
echo $blaettern->navBar('news');

$sql = "SELECT
			id, 
			datum, 
			text 
		FROM 
			news
 		WHERE
			checked=1
		ORDER BY 
			datum 
		DESC LIMIT 
			$blaettern->startEntry,
			$blaettern->tableOffset";
$ergebnis = $db->query($sql);

while($zeile = $ergebnis->fetch_object())
{
	echo "ID: " . $zeile->id . "<br />
";
	echo "DATUM: " . $zeile->datum . "<br />
";
	echo "TEXT: " . $zeile->text . "<br />
";;
}

echo $blaettern->navBar('news');
?>

Das MySqli-Objekt wird in der mysqli.php erstellt;
Hier kann sich jeder gerne auf php.net erkundigen, wie es geht, da ich MySqli und printf hier nicht genauer erklären werde.
<?php
$db = new mysqli('localhost', 'nickname', 'passwort', 'datenbank');

if (mysqli_connect_errno())
{
   	printf("Connect failed: %s
", mysqli_connect_error());
   	exit();
}
?>
Nun zur Erklärung für den Aufruf:

1. Als Erstes wird ein neues Objekt erstellt und mit den Variablen geladen.
$blaettern = new blaettern($db, 'news', 5, 8, 'checked=1');

/*
$blaettern = new blaettern('datenbankobjekt', 'gewünschte tabelle' 'einträge pro seite' 'anzahl der sichtbaren navigationselemente' 'WhereClause' );

Die WhereClause muss nicht angegeben werden, kann aber angegeben werden, falls nur bestimmte Einträge angezeigt werden sollen. Dieses WhereClause muss dann jedoch auch im späteren SQL-String enthalten sein.
*/
2. Dann wird die Navigationsleiste ausgegeben (könnt ihr selbst bestimmen, wo sie ausgegeben werden soll):

echo $blaettern->navBar('news');

/*
echo $blaettern->navBar('$variable1','$variable2');

$variable1 ist was in der Adresszeile stehen soll (?s=news) also 'news'.

$variable2 ist für andere Anhänge, z.B. '&id=1' oder was ihr da auch immer stehen haben solltet.
*/
3. Dann wird der SQL-Sring vorbereitet, ausgeführt und ausgegeben; danach wird nochmals die Navigationsleiste ausgegeben:

$sql = "SELECT
			id, 
			datum, 
			text 
		FROM 
			news
 		WHERE
			checked=1
		ORDER BY 
			datum 
		DESC LIMIT 
			$blaettern->startEntry,
			$blaettern->tableOffset";
$ergebnis = $db->query($sql);

while($zeile = $ergebnis->fetch_object())
{
	echo "ID: " . $zeile->id . "<br />
";
	echo "DATUM: " . $zeile->datum . "<br />
";
	echo "TEXT: " . $zeile->text . "<br />
";;
}

echo $blaettern->navBar('news');

/*
$blaettern->startEntry ist eine von der Klasse berechnete Variable und $blaettern->tableOffset ist die Anzahl der Einträge, die angezeigt werden sollen.
*/

Anpassung der Klasse an euer Script:

1. Nehmen wir mal an, ihr habt nicht wie ich hier eure Seite mit 'index.php?s=news' aufgerufen, sondern mit index.php?section=news, dann ändert ihr dies in der funcion navBar:

public function navBar($s, $var='')
	{
		$navBar = '';
		$NavCeil = floor($this->naviOffset / 2);
		if($this->currentPage > 1)
		{
			$navBar .= '<a href="?s='.$s.$var.'&page=1">|<</a>&nbsp;';
			//wird zu $navBar .= '<a href="?section='.$s.$var.'&page=1">|<</a>&nbsp;';
			$navBar .= '<a href="?s='.$s.$var.'&page='.($this->currentPage-1).'"><</a>&nbsp;';
			//wird zu $navBar .= '<a href="?section='.$s.$var.'&page='.($this->currentPage-1).'"><</a>&nbsp;';
		}
		else
		{
			$navBar .= "|<&nbsp;";
			$navBar .= "<&nbsp;";
		}
		for ($x=$this->currentPage-$NavCeil;$x<=$this->currentPage+$NavCeil;$x++)
		{
			if (($x>0 && $x<$this->currentPage) || ($x>$this->currentPage && $x<=$this->totalPages))
			{
				$navBar .= '<a href="?s='.$s.$var.'&page='.$x.'">'.$x.'</a>&nbsp;';
				//wird zu $navBar .= '<a href="?section='.$s.$var.'&page='.$x.'">'.$x.'</a>&nbsp;';
			}
			if ($x==$this->currentPage)
			{
				$navBar .= '<b>' . $x . '</b>&nbsp;';
			}
		}
		if($this->currentPage < $this->totalPages)
		{
			$navBar .= '<a href="?s='.$s.$var.'&page='.($this->currentPage+1).'">></a>&nbsp;';
			//wird zu $navBar .= '<a href="?section='.$s.$var.'&page='.($this->currentPage+1).'">></a>&nbsp;';
			$navBar .= '<a href="?s='.$s.$var.'&page='.ceil($this->totalPages).'">>|</a>&nbsp;';
			//wird zu $navBar .= '<a href="?section='.$s.$var.'&page='.ceil($this->totalPages).'">>|</a>&nbsp;';
		}
		else
		{
			$navBar .= ">&nbsp;";
			$navBar .= ">|&nbsp;";
		}
		return $navBar;
	}
2. Nehmen wir mal an, ihr habt nicht wie ich hier eure Seite mit 'index.php?s=news' aufgerufen, sondern direkt mit news.php dann ändert ihr dies (wie unerwartet :P) in der function navBar:

public function navBar($s, $var='')
//wird zu public function navBar($var='')
	{
		$navBar = '';
		$NavCeil = floor($this->naviOffset / 2);
		if($this->currentPage > 1)
		{
			$navBar .= '<a href="?s='.$s.$var.'&page=1">|<</a>&nbsp;';
			//wird zu $navBar .= '<a href="?page=1&'.$var.'">|<</a>&nbsp;';
			$navBar .= '<a href="?s='.$s.$var.'&page='.($this->currentPage-1).'"><</a>&nbsp;';
			//wird zu $navBar .= '<a href="?page='.($this->currentPage-1).'&'.$var.'"><</a>&nbsp;';
		}
		else
		{
			$navBar .= "|<&nbsp;";
			$navBar .= "<&nbsp;";
		}
		for ($x=$this->currentPage-$NavCeil;$x<=$this->currentPage+$NavCeil;$x++)
		{
			if (($x>0 && $x<$this->currentPage) || ($x>$this->currentPage && $x<=$this->totalPages))
			{
				$navBar .= '<a href="?s='.$s.$var.'&page='.$x.'">'.$x.'</a>&nbsp;';
				//wird zu $navBar .= '<a href="?page='.$x.'&'.$var.'">'.$x.'</a>&nbsp;';
			}
			if ($x==$this->currentPage)
			{
				$navBar .= '<b>' . $x . '</b>&nbsp;';
			}
		}
		if($this->currentPage < $this->totalPages)
		{
			$navBar .= '<a href="?s='.$s.$var.'&page='.($this->currentPage+1).'">></a>&nbsp;';
			//wird zu $navBar .= '<a href="?page='.($this->currentPage+1).'&'.$var.'">></a>&nbsp;';
			$navBar .= '<a href="?s='.$s.$var.'&page='.ceil($this->totalPages).'">>|</a>&nbsp;';
			//wird zu $navBar .= '<a href="?page='.ceil($this->totalPages).'&'.$var.'">>|</a>&nbsp;';
		}
		else
		{
			$navBar .= ">&nbsp;";
			$navBar .= ">|&nbsp;";
		}
		return $navBar;
	}

/*
Der Aufruf in der news.php muss dann auch anders aussehn:
echo $blaettern->navBar($var);
$var ist dann einfach euer 'id=1' oder Ähnliches.
*/

Falls ihr die Klasse live in Aktion sehen wollt, dann besucht doch mal meine Seite: partypeople.eluhost.de (Seite ist noch im Aufbau, aber die Blätterfunkton ist schon drin xD).

So, das war's von meiner Seite aus.
Ich wünsche euch viel Spaß mit meiner Klasse.

Falls Fragen bestehen, schreibt diese in die Kommis. Ich werde gerne antworten.

MfG

Zoidbert

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von K-Dawg
  • 29.01.2011 - 17:12

Ist zwar nicht unbedingt ein Tutorial, aber hilfreich ist es alle mal.
Natürlich kann hier und da noch daran gefeilt werden.

Vielen dank für eine Mühe.

Gruß

Portrait von K-Dawg
  • 29.01.2011 - 17:13

Sorry, soll "deine Mühe" seind. Mein D klemmt.

Portrait von Christian
  • 24.01.2010 - 15:57

Klasse mag vielleicht funktionieren, aber ein Tutorial ist es sicher nicht. Nicht mal im Ansatz die Mühe gemacht Erklärungen abzugeben. Ganz abgesehen davon, dass HTML Generierung und Datenhandling in einer Klasse zusammen nichts zu suchen haben.

Portrait von Zoidbert
  • 16.01.2010 - 18:12

Hi, die Seite mit Inhalt wird von mir nicht mehr weitergeführt, da ich einen neuen Hoster ohne die lästige Werbung gefunden habe.

Ich denke dass ich die Seite (partypeople.eluhost.de) weiterhin als Beispielobjekt benutzen werde.

MFG Zoidbert

Portrait von psdgustav
  • 14.01.2010 - 10:13

Das mit der Werbung klappt SUPER!!!
Bin ich jetzt der Dumme oder willst Du wirklich die Seite mit Inhalt hinterlegen?
Gustav

x
×
×