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

➤ 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:  AusblendenKopierenLinkZeilen

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 < || $AktuelleSeite > $AnzahlSeiten $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'$VersatzPDO::PARAM_INT);
$select->bindValue(':dseite'$DatensaetzeSeitePDO::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> ?
  
'<a href="?seite=' . ($AktuelleSeite 1) . '">&#9668;</a>:
  
&#9668;') .
 
<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) . '">&#9658;</a>:
   
&#9658;') .
 
'</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:  AusblendenKopierenLinkZeilen

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 < || $seite > $seiten $seite;

   
// Den Versatz ermitteln
   
$versatz $seite $BEITRAEGE_SEITE $BEITRAEGE_SEITE;

   
// Anzahl der gefundenen Beiträge und Seiten ausgeben
   
echo '<p>Es ' . ($anzahlBeitraege == '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>&emsp; <span>[&hellip;]</span> ' $text ' [&hellip;]</small></li>';
   }
   echo 
'</ol>';

  
// Link-, und Formular-Navigation
  
$mC = isset($_GET["mc"]) ? "&mc" "";
  
define("NAVIGATION"'<form method="get" autocomplete="off"><p>
   ((
$seite 1> '<a href="?seite=' . ($seite 1) . '&suchbegriff=' $suchbegriff $mC '&suchen" title="Zurück zu Seite ' . ($seite 1) . '">&#9664;</a>&nbsp; &nbsp; ') .
   
' 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) . '">&#9654;</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.