omroettger
Goto Top

Über Suchabfrage Datensätze über mehrere Seiten verteilen

In meinem Formular habe ich die Möglichkeit mehrere Suchbegriffe über ein Eingabefeld einzugeben. Nun möchte ich die Datensätze über mehrere Seiten verteilen.
In meinem Script wird die erste Seite richtig angezeigt, wechsle ich nun zu Seite 2, ist diese leer. Gebe ich aber nun auf Seite 2 dieselben Suchkriterien an, werden mir
die nächsten Datensätze angezeigt.
Vielleicht hat ja jemand eine Idee. Über jede Hilfe wäre ich sehr dankbar.

Hier mein Code:
<html>
<head>
</head>
<body>
<form method="post">  
<div style='text-align:center;margin:20px 0px;'><input type="text" name="q"><input type="submit" value="Suchen"></div>  
</form>
<?php
	$db = new PDO('mysql:host=ww4.ddns.net;dbname=db_event;charset=utf8', 'mark', '#P1a2t3r4?#');  
	
	if (isset($_POST["q"])) {  
	
        // Anzeige der Datensätze pro Seite
	$DatensaetzeSeite = 6;
	$AnzahlDatensaetze = $db->query("SELECT COUNT(*) FROM `eingabeform_event`")->fetchColumn(0);  
	$AnzahlSeiten = ceil($AnzahlDatensaetze / $DatensaetzeSeite);
	$AktuelleSeite = isset($_GET["seite"]) ? $_GET["seite"] : 1;  
	$AktuelleSeite = ctype_digit($AktuelleSeite) ? $AktuelleSeite : 1;
	$AktuelleSeite = $AktuelleSeite < 1 || $AktuelleSeite > $AnzahlSeiten ? 1 : $AktuelleSeite;
	$Versatz = $AktuelleSeite * $DatensaetzeSeite - $DatensaetzeSeite;
			
	// suchformular mehrere Eingaben
	$search = preg_split('/[\s]+/', $_POST["q"]);  
	if (count($search) > 0) {
	$searchfield = ;
	foreach ($search as $s) {
	if (mb_strlen($s) >= 3) {
        $searchfield = $s;
       }
       }
       $totalwords = count($searchfield);
       $placeholder = [":p1", ":p2", ":p3"];   
       if ($totalwords > 0 &&
      $totalwords <= count($placeholder)) {

      $string1 = ""; // DATE_FORMAT(`datum`,'%d.%m.%Y')  
      foreach($searchfield as $key => $searchword) {
      $string1 .= " DATE_FORMAT(`Datum`,'%d.%m.%Y')" . " LIKE " . $placeholder[$key];  
      if ($key != ($totalwords - 1)) {
      $string1 .= " OR ";  
      }
      }
     $string2 = ""; // `uhrzeit`  
     foreach($searchfield as $key => $searchword) {
     $string2 .= " `Uhrzeit`" . " LIKE " . $placeholder[$key];  
      if ($key != ($totalwords - 1)) {
     $string2 .= " OR ";  
     }
     }
    $string3 = ""; // `Genre`  
    foreach($searchfield as $key => $searchword) {
    $string3 .= " `Genre`" . " LIKE " . $placeholder[$key];  
    if ($key != ($totalwords - 1)) {
    $string3 .= " OR ";  
    }
    }  
        // SQL zusammensetzen  
	$select = $db->prepare("SELECT `id`, DATE_FORMAT(`datum`,'%d.%m.%Y') AS `datum`, `Uhrzeit`, `Genre`  
				FROM `eingabeform_event`
				WHERE 
				( " . $string1 . " )  
				OR
				( " . $string2 . " )   
				OR
				( " . $string3 . " )  

				ORDER BY `datum` ASC
				LIMIT :versatz, :dseite");  
                
	$select->bindValue(':versatz', $Versatz, PDO::PARAM_INT);  
	$select->bindValue(':dseite', $DatensaetzeSeite, PDO::PARAM_INT);    

       // bindValue mit den Platzhaltern und Werten setzen
	foreach ($searchfield as $key => $wort) {
	$like = "%" . $wort . "%";  
	$select->bindValue($placeholder[$key], $like);
	}

	// Anfrage ausführen
	$select->execute();
	$events = $select->fetchAll(PDO::FETCH_OBJ);
	
	//if ($AnzahlDatensaetze > 0) {
	if ($select->rowCount() > 0 AND $AnzahlDatensaetze > 0 ) {
	
	echo "<center>";  
		echo "<table border=\"1\">\n";		  
            echo "<tr align left>";  
				echo "<th align=left width=50><font face=\"arial\" size=3 color=#66CCFF>id</font></th>";  
				echo "<th align=left width=100><font face=\"arial\" size=3 color=#66CCFF>Datum</font></th>";  
				echo "<th align=left width=100><font face=\"arial\" size=3 color=#66CCFF>Uhrzeit</font></th>";  
				echo "<th align=left width=100><font face=\"arial\" size=3 color=#66CCFF>Genre</font></th>";  
            echo "</tr>";  
		echo "</table>";  
	echo "<center>";	  
        foreach ($events as $event) {
	echo "<center>";  
	echo "<table border=\"1\">\n";  
		echo "<tr align=left>";  
			echo 	"<td width=50><font face=\"arial\" size=2 color=black>$event->id</font></td>";  
			echo	"<td width=100><font face=\"arial\" size=2 color=black>$event->datum</font></td>";  
			echo	"<td width=100><font face=\"arial\" size=2 color=black>$event->Uhrzeit</font></td>";  
			echo	"<td width=100><font face=\"arial\" size=2 color=black>$event->Genre</font></td>";  
		echo "</tr>";  
	echo "</table>";  
	echo "<center>";  

					}
				}
	                }
	       }	
// Seitenfunktion
 echo '<form method="GET" autocomplete="off">' .  
  (($AktuelleSeite - 1) > 0 ?
  '<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>';  
}
?>
</body>
</html>

Content-Key: 578465

Url: https://administrator.de/contentid/578465

Printed on: April 25, 2024 at 08:04 o'clock

Member: maretz
maretz Jun 11, 2020 at 06:40:34 (UTC)
Goto Top
Du machst das auch max. komplex, oder?

Entweder lade dir die Ergebnisse in nen Array und gebe halt aus dem Array die passenden Elemente aus (z.B. du hast 10 Einträge pro Seite:
Seite 1: Eintrag 1 - 10 -> Array-Element 1+0*10)
Seite 2: Eintrag 11-20 -> Array-Element 1+1*10)
Seite 3: Eintrag 21-30 -> Array-Element 1+2*10)

Da Seitenzahlen nur Ganzzahlig sein können (ich gehe mal davon aus dein formular lässt nicht zu das der Benutzer die Seite eingibt und dabei seite 1,5 eingeben kann) brauchst du ne ganze menge von dem Kram nicht...
Member: omroettger
omroettger Jun 11, 2020 at 07:32:50 (UTC)
Goto Top
Entschuldige, aber was meinst Du mit max.komplex? Meinst Du maximalen Wert. Dann ja.

Ich werde es mit der Ausgabe in nen Array mal ausprobieren, doch es können bei einer max Abfrage bis zu 10000 Datensätze angezeigt werden.
Dies ist aber höchst unwahrscheinlich.

Ich werde das Formular später erweitern, so dass man eine Seitenzahl eingeben kann. Aber zur Zeit steht diese Funktion nicht zur Verfügung.

Vielen Dank schon einmal. Ich bin heute nachmittag wieder online.
Member: omroettger
omroettger Jun 11, 2020 at 18:22:56 (UTC)
Goto Top
Ich habe es mit dem Array ausprobiert und es funktioniert. Ich habe 25 Datensätze pro Seite und in meinem Test waren es maximal 1000 Datensätze, die angezeigt wurden. Also 40 Seiten! Die Funktion der Seitenanzeige habe ich auch geändert.

Vielen Dank für die Antwort.

Gruß

Mark