Kombinierte Formular.- und Blätterfunktion
Damit nicht alle Daten einer DB-Tabelle (MySQL/MariaDB) auf einmal auf der Seite zu sehen sind, sondern übersichtlich auf mehreren Seiten verteilt stehen, benutzt man eine Seitennavigation zum blättern (Pagination).
Mit den Pfeil-Symbolen (◄ ►) kann man zur nächsten oder vorherigen Seite wechseln oder einfach direkt durch die Eingabe einer Seitenzahl in das Formularfeld.
![[Bildschirmfoto]
Kombinierte Formular.- und Blätterfunktion [Bildschirmfoto]
Kombinierte Formular.- und Blätterfunktion](img/kombinierte_formular-_und_blaetterfunktion.png)
➤ Dieses Script ist ein Teil der Anleitung: Erster Eintrag in eine MySQL-Datenbank mit PHP. Ein Beispiel für mysqli() finden Sie unter: Daten auf mehreren Seiten aufteilen.
• Suchergebnisse auf mehrere Seiten aufteilen (weiter unten auf dieser Seite)
Quelltext: Ausblenden ❘ Kopieren ❘ Link ❘ Zeilen ❘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Nachrichten</title>
<style>
body {
font-family: Verdana, Arial, Sans-Serif;
}
a:link, a:visited {
color: Royalblue;
text-decoration: None;
}
</style>
</head>
<body>
<h3>Nachrichten</h3>
<?php
// Verbindung zur Datenbank aufbauen.
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
// Anzeige der Datensätze pro Seite
$DatensaetzeSeite = 3;
// Anzahl der Datensätze ermitteln
$AnzahlDatensaetze = $db->query("SELECT COUNT(*) FROM `nachrichten`")->fetchColumn(0);
// Die Anzahl der Seiten ermitteln
$AnzahlSeiten = ceil($AnzahlDatensaetze / $DatensaetzeSeite);
// Die aktuelle Seite ermitteln
$AktuelleSeite = ($_GET["seite"] ?? 1);
// Den Wert überprüfen und ggf. ändern
$AktuelleSeite = ctype_digit((string)$AktuelleSeite) ? $AktuelleSeite : 1;
$AktuelleSeite = $AktuelleSeite < 1 || $AktuelleSeite > $AnzahlSeiten ? 1 : $AktuelleSeite;
// Den Versatz ermitteln
$Versatz = $AktuelleSeite * $DatensaetzeSeite - $DatensaetzeSeite;
// Datensätze auslesen
$select = $db->prepare("SELECT `titel`, `autor`, `nachricht`, `datum`
FROM `nachrichten`
ORDER BY `datum` DESC
LIMIT :versatz, :dseite");
$select->bindValue(':versatz', $Versatz, PDO::PARAM_INT);
$select->bindValue(':dseite', $DatensaetzeSeite, PDO::PARAM_INT);
$select->execute();
$nachrichten = $select->fetchAll(PDO::FETCH_OBJ);
// Ausgabe über eine Foreach-Schleife
if ($AnzahlDatensaetze > 0) {
foreach ($nachrichten as $nachricht) {
sscanf($nachricht->datum, "%4s-%2s-%2s", $jahr, $monat, $tag);
echo '<p><small>' . $tag . '.' . $monat . '.' . $jahr .
'</small> - <b>' . $nachricht->titel . '</b><br>' .
' Autor: <em>' . $nachricht->autor . '</em><br>' .
nl2br($nachricht->nachricht) . '</p>';
}
// Formular.- und Blätterfunktion
echo '<form method="GET" autocomplete="off">' .
(($AktuelleSeite - 1) > 0 ?
'<a href="?seite=' . ($AktuelleSeite - 1) . '">◄</a>' :
' ◄') .
' <label>Seite <input type="text" value="' . $AktuelleSeite . '" name="seite" size="3"
title="Seitenzahl eingeben und Eingabetaste betätigen"> von ' . $AnzahlSeiten . '</label>' .
(($AktuelleSeite + 1) <= $AnzahlSeiten ?
' <a href="?seite=' . ($AktuelleSeite + 1) . '">►</a>' :
' ►') .
'</form>';
}
else {
echo '<p>Keine Nachrichten vorhanden.</p>';
}
?>
</body>
</html>
DB-Tabelle
Folgende DB-Tabelle wurde im Anwendungsbeispiel verwendet:
CREATE TABLE `nachrichten` ( `id` int(11) NOT NULL AUTO_INCREMENT, `titel` varchar(80) COLLATE utf8_unicode_ci NOT NULL, `autor` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `nachricht` text COLLATE utf8_unicode_ci NOT NULL, `datum` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO `nachrichten` (`id`, `titel`, `autor`, `nachricht`, `datum`) VALUES (1, 'Sprüche 1', 'Werner', 'Stur lächeln und winken, Männer!', '2016-07-01'), (2, 'Yeti gefunden', 'Jörg', 'Gestern in den Morgenstunden sah Reinhold M. einen ...', '2016-07-04'), (3, 'Eine Scheibe', 'Hans', 'Die Erde ist eine Scheibe Käse, hier der Beweis ...', '2016-07-02'), (4, 'Wasser und Balken', 'Stefan', 'Wasser hat keine Balken. Wirklich! ...', '2016-07-09');
Voraussetzung
PHP 5.6+, MySQL/MariaDB - Datenbank
Suchergebnisse auf mehrere Seiten aufteilen
Hier ein Beispiel wie Suchergebnisse auf mehreren Seiten verteilt werden können.
Quelltext: Ausblenden ❘ Kopieren ❘ Link ❘ Zeilen ❘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>Suche</title>
</head>
<body>
<?php
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$BEITRAEGE_SEITE = 2;
$SUCHBEGRIFF_MIN = 5;
$TEXTAUSSCHNITT = 150;
$TABELLE = "tabelle_1"; // Name der DB-Tabelle
// Formular
$matchCase = isset($_GET["mc"]) ? "BINARY " : "";
$matchCaseCheck = isset($_GET["mc"]) ? ' checked="checked"' : '';
echo '<fieldset>
<legend><span>Suche</span></legend>
<form method="get">
<p>Suchen nach:<br>
<input type="search" name="suchbegriff" size="35" maxlength="50"' . (isset($_GET['suchbegriff']) ? ' value="' . $_GET['suchbegriff'] . '"' : '') . ' required="required" autofocus="autofocus" placeholder="Suchbegriff eingeben">
<input type="submit" name="suchen" value="suchen" title="Suche starten!"><br>
<input type="checkbox" name="mc"' . $matchCaseCheck . ' id="mc"> <label for="mc"><small>Groß.- und Kleinschreibung beachten</small></label>
</p>
</form>
</fieldset>';
// Formular abgesendet
if (isset($_GET["suchen"])) {
$suchbegriff = strip_tags(trim($_GET["suchbegriff"]));
if (strlen($suchbegriff) >= $SUCHBEGRIFF_MIN) {
// Die Anzahl der Treffer des Suchbegriffs ermitteln
$select = $db->prepare("SELECT `id`
FROM `" . $TABELLE . "`
WHERE (" . $matchCase . "`thema` LIKE :suchbegriff OR
" . $matchCase . "`text` LIKE :suchbegriff OR
`datum` LIKE :suchbegriff)
GROUP BY `thema`");
$like = "%" . $suchbegriff . "%";
$select->execute([':suchbegriff' => $like]);
$anzahlBeitraege = $select->rowCount();
// Gefundene Beiträge anzeigen
if ($anzahlBeitraege > 0) {
// Die Seiten ermitteln
$seiten = ceil($anzahlBeitraege / $BEITRAEGE_SEITE);
// Den gesendeten Wert überprüfen und ggf. ändern
$seite = ($_GET["seite"] ?? 1);
$seite = is_string($seite) && ctype_digit((string)$seite) ? $seite : 1;
$seite = $seite < 1 || $seite > $seiten ? 1 : $seite;
// Den Versatz ermitteln
$versatz = $seite * $BEITRAEGE_SEITE - $BEITRAEGE_SEITE;
// Anzahl der gefundenen Beiträge und Seiten ausgeben
echo '<p>Es ' . ($anzahlBeitraege == 1 ? 'wurde 1 Beitrag' :
'wurden ' . $anzahlBeitraege . ' Beiträge') . ' gefunden' . ( $anzahlBeitraege > $BEITRAEGE_SEITE ? ' - Seite ' . $seite . ' von ' . $seiten : '') . '.</p>';
// Gefundene Beiträge auslesen
$select = $db->prepare("SELECT `id`, `thema`, `text`, `datum`
FROM `" . $TABELLE . "`
WHERE (" . $matchCase . "`thema` LIKE :suchbegriff OR
" . $matchCase . "`text` LIKE :suchbegriff OR
`datum` LIKE :suchbegriff)
GROUP BY `thema`
ORDER BY `datum` DESC
LIMIT " . $versatz . ", " . $BEITRAEGE_SEITE);
$select->execute([':suchbegriff' => $like]);
$beitraege = $select->fetchAll(PDO::FETCH_OBJ);
// Beiträge ausgeben
echo '<ol start="' . ($versatz+1) . '">';
foreach ($beitraege as $beitrag) {
$text = strip_tags($beitrag->text);
$start = mb_strpos(mb_strtolower($text), mb_strtolower($suchbegriff)) - round($TEXTAUSSCHNITT/2);
if ($start < 0) $start = 0;
$ende = mb_strlen($suchbegriff) + $TEXTAUSSCHNITT;
$text = preg_replace('/(' . $suchbegriff . ')/i', "<mark>\$1</mark>", mb_substr($text, $start, $ende));
echo '<li>' . $beitrag->thema . '</a><br>' .
'<small>  <span>[…]</span> ' . $text . ' […]</small></li>';
}
echo '</ol>';
// Link-, und Formular-Navigation
$mC = isset($_GET["mc"]) ? "&mc" : "";
define("NAVIGATION", '<form method="get" autocomplete="off"><p>' .
(($seite - 1) > 0 ? '<a href="?seite=' . ($seite - 1) . '&suchbegriff=' . $suchbegriff . $mC . '&suchen" title="Zurück zu Seite ' . ($seite - 1) . '">◀</a>' : ' ') .
' Seite: <input type="number" value="' . $seite . '" name="seite" size="3" maxlength="4" min="1" max="' . $seiten . '" required="required" onclick="this.select()" title="Seitenzahl eingeben und die Eingabetaste drücken."> von ' . $seiten .
(($seite + 1) <= $seiten ? ' <a href="?seite=' . ($seite + 1) . '&suchbegriff=' . $suchbegriff . $mC . '&suchen" title="Weiter zu Seite ' . ($seite + 1) . '">▶</a>' : '') .
'<input type="hidden" name="suchbegriff" value="' . $suchbegriff . '">' . (isset($_GET["mc"]) ? '<input type="hidden" name="mc">' : '' ) . '<input type="hidden" name="suchen" value="suchen"></p></form>');
echo $anzahlBeitraege >= $BEITRAEGE_SEITE ? NAVIGATION : '';
}
else {
echo '<p>Es wurden keine Beiträge gefunden!</p>';
}
}
else {
echo '<p>Es sind min. ' . $SUCHBEGRIFF_MIN . ' Zeichen nötig!</p>';
}
}
?>
</body>
</html>
DB-Tabelle
Folgende DB-Tabelle wurde im Anwendungsbeispiel verwendet:
CREATE TABLE `tabelle_1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `thema` varchar(250) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `text` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `datum` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci; INSERT INTO `tabelle_1` (`id`, `thema`, `text`, `datum`) VALUES (1, 'Ich bin Blindtext 1', 'Ich bin Blindtext. Von Geburt an. Es hat lange gedauert, \r\nbis ich begriffen habe, was es bedeutet, ein blinder Text zu sein: \r\nMan macht keinen Sinn. Man wirkt hier und da aus dem Zusammenhang \r\ngerissen. Oft wird man gar nicht erst gelesen. ', '2018-12-19 11:01:35'), (2, 'Ich bin Blindtext 2', 'Ich weiß, dass ich nie die Chance haben werde im Stern zu erscheinen. \r\nAber bin ich darum weniger wichtig? Ich bin blind! Aber ich bin gerne Text. \r\nUnd sollten Sie mich jetzt tatsächlich zu Ende lesen, Blindtext dann habe ich etwas \r\ngeschafft, was den meisten \"normalen\" Texten nicht gelingt.\r\n', '2018-12-19 11:02:35'), (3, 'Ich bin Blindtext 3', 'Ich bin blind! Aber ich bin gerne Text. Und sollten Sie mich jetzt tatsächlich \r\nzu Ende lesen, dann habe ich etwas geschafft, was den meisten \"normalen\" \r\nTexten nicht gelingt. Ich bin Blindtext.\r\n', '2018-12-19 11:03:16'), (4, 'Ich bin Blindtext 4', 'Überall dieselbe alte Leier. Das Layout ist fertig, der Text lässt auf sich warten. Damit das Layout nun nicht nackt im Raume steht und sich klein und leer vorkommt, springe ich ein: der Blindtext.\r\n', '2018-12-19 11:04:03'), (5, 'Ich bin Blindtext 5', 'Genau zu diesem Zwecke erschaffen, immer im Schatten meines großen Bruders »Lorem Ipsum«, freue ich mich jedes Mal, wenn Sie ein paar Zeilen lesen. Denn \"esse est percipi\" - Sein ist wahrgenommen werden.', '2018-12-19 11:04:40');
➤ Gefällt Ihnen das Skript oder haben Sie einen Fehler gefunden? Dann freue ich mich auf Ihren Kommentar.