InternInhaltsverzeichnisGlossarBausteineLinklisteTutorialsKommentare

Thema: Daten auf mehreren Seiten aufteilen Artikel anzeigen

Peter schrieb am Montag, den 18 September 2017 #1
Hallo Werner,

Fantastisch deine Arbeit hier. Ich versuch mich gerade im Erstellen einer GLOSSAR Datenbank.

Funktioniert auch alles wunderbar. Nur das Problem ist die Blätterfunktion.

Die Blätterfunktion funktioniert nur, wenn alle Buchstaben ausgewählt sind.

Wenn aber zB Buchstabe B (Einträge unter B) ausgewählt wird, funktioniert die Blätterfunktion - es scheitert an der 2. Url GET Parameter.

Kann man das verbinden?

Hier der Ausschnitt aus dem Code:

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
<?php
include "incl/connect.php";
$abc range('A''Z');

echo 
"<ul class=\"glossar-menu\">\n";
echo 
"<li><a title=\"Alle Beiträge\" href=\"./\">Alle</a></li>\n";
foreach(
$abc as $menu) {
 echo 
"<li><a title=\"Auswahl Kategorie nach Buchstaben\" href=\"?buchstabe=" $menu."\">" strtoupper($menu) . "</a></li>\n";
}
echo 
"</ul>\n";

// Anzahl der Datensätze (Nachrichten) pro Seite
$select $db->query("SELECT `datensatz` FROM `anzahl_datensatz`");
$DatensaetzeSeite $select->fetchColumn();

// Anzahl der Datensätze ermitteln
$select $db->query("SELECT `id` FROM `glossar`");
$AnzahlDatensaetze $select->rowCount();
// Sind Datensätze vorhanden?
if ($AnzahlDatensaetze 0) {
// Die Anzahl der Seiten ermitteln
$AnzahlSeiten ceil($AnzahlDatensaetze $DatensaetzeSeite);
// Die aktuelle Seite ermitteln
$AktuelleSeite = isset($_GET["seite"]) ? $_GET["seite"] : 1;
// Den über $_GET["seite"] gesendeten Wert überprüfen und ggf. ändern
$AktuelleSeite ctype_digit($AktuelleSeite) ? abs((int)$AktuelleSeite) : 1;
$AktuelleSeite $AktuelleSeite || $AktuelleSeite $AnzahlSeiten $AktuelleSeite;
// Den Versatz ermitteln
$Versatz $AktuelleSeite $DatensaetzeSeite $DatensaetzeSeite;

// Formular.- und Blätterfunktion
echo '<form action="#top" method="GET" autocomplete="off">' .
((
$AktuelleSeite 1) > ?
'<a href="?seite=' . ($AktuelleSeite 1) . '">« zurück</a>  ' '') .
' <label>Seite <input type="text" value="' $AktuelleSeite '" name="seite" size="3"' .
' title="Seitenzahl eingeben und die Eingabetaste drücken."> von ' $AnzahlSeiten '</label>' .
((
$AktuelleSeite 1) <= $AnzahlSeiten ?
'  <a href="?seite=' . ($AktuelleSeite 1) . '">weiter »</a>' '') .
'</form>';

$list = (isset($_GET['buchstabe'])) ? $_GET['buchstabe'] : '';

if(!empty(
$list) && $list != '') {
 
// Ausgabe Kategorie nach Buchstaben
 
$select $db->query("SELECT id, buchstabe, titel, beschreibung FROM `glossar` WHERE buchstabe='".addslashes($list)."' ORDER BY titel ASC LIMIT " $Versatz ", " $DatensaetzeSeite);
 
$nachrichten $select->fetchAll(PDO::FETCH_OBJ);

foreach (
$nachrichten as $nachricht) {
 echo 
'<div class="glos1">';
 echo 
'<span class="glos2">'$nachricht->titel .'</span>';
 echo 
'<div class="glossbeitrag">'$nachricht->beschreibung .'</div>';
 echo 
'</div>';
}

} else {

  
// Ausgabe Alle Beiträge
  
$select $db->query("SELECT id, buchstabe, titel, beschreibung FROM `glossar` ORDER BY titel ASC LIMIT " $Versatz ", " $DatensaetzeSeite);
  
$nachrichten $select->fetchAll(PDO::FETCH_OBJ);
  
  foreach (
$nachrichten as $nachricht) {
   echo 
'<div class="glos1">';
   echo 
'<span class="glos2">' $nachricht->titel '</span>';
   echo 
'<div class="glossbeitrag">' $nachricht->beschreibung '</div>';
   echo 
'</div>';
  }
 }
}
else {
echo 
'<p><b>Keine Einträge vorhanden.</b></p>';
}
?>


Beste Grüße Peter
Werner schrieb am Montag, den 18 September 2017 #2
Habe da in der Blätterfunktion den mit GET gesendeten Buchstaben angehängt, ich hoffe das ist das was du meinst!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$buchstabe 
= isset($_GET["buchstabe"]) ? $_GET["buchstabe"] : 'A';

// Formular.- und Blätterfunktion  
echo '<form action="#top" method="GET" autocomplete="off">
 <input type="hidden" name="buchstabe" value="' $buchstabe '">' .
 ((
$AktuelleSeite 1) > ?
 
'<a href="?seite=' . ($AktuelleSeite 1) .'&buchstabe=' $buchstabe '">&laquo; zurück</a>&nbsp;&nbsp;' '') .
 
' <label>Seite <input type="text" value="' $AktuelleSeite '" name="seite" size="3"' 
 
' title="Seitenzahl eingeben und die Eingabetaste drücken."> von ' $AnzahlSeiten '</label>' .
 ((
$AktuelleSeite 1) <= $AnzahlSeiten ?
 
'&nbsp;&nbsp;<a href="?seite=' . ($AktuelleSeite +1) . '&buchstabe=' $buchstabe '">weiter &raquo;</a>' '') .
 
'</form>';
?>
Peter schrieb am Dienstag, den 19 September 2017 #3
Vielen herzlichen Dank Werner, funktioniert perfekt.

Beste Grüße Peter
Peter schrieb am Dienstag, den 26 September 2017 #4
Hallo Werner,
Ich bin gerade dabei, das Login Formular (in den Admin-Bereich) mit Hilfe meines Buches zu erstellen, was auch super funktioniert.

Das Passwort kommt verschlüsselt aus der Datenbank. Ich möchte das Login Formular zusätzlich mit dem Rechencaptcha schützen, was mir aber nicht gelegt.

Das Captcha arbeitet nur, wenn ich die Login Daten absichtlich falsch eingebe - es arbeitet nicht, wenn die Login Daten stimmen, aber die Rechenaufgabe falsch eingeben wird.

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

<?php
session_start
();
require_once 
"../blabla/connect.php";
?>
<!DOCTYPE html>
<html lang="de-at">
<head>
<meta charset="UTF-8">
<title>Anmeldung</title>
<meta name="robots" content="noindex">
<link rel="stylesheet" media="all" href="../css/glossar.css">
</head>
<body>
<div id="main">
<h1>Anmeldung</h1>
<?php 
if(isset($_SESSION['user_id']) ){
    
header("Location: datenverwaltung.php");
}

if(!empty(
$_POST['benutzername']) && !empty($_POST['passwort'])) {
    
    
$log $db->prepare("SELECT `benutzername`, `passwort`
                                       FROM `user`
                                       WHERE `benutzername` = :benutzername");
    
$log->bindParam(':benutzername'$_POST['benutzername']);
    
$log->execute();
    
$results $log->fetch(PDO::FETCH_ASSOC);

    if(
count($results) > && password_verify($_POST['passwort'], $results['passwort']) ){

        
$_SESSION['user_id'] = $results['benutzername'];
        
header("Location: datenverwaltung.php");

    } 
    
    echo 
"<p class='ko'>Benutzername oder Passwort ist ungültig.</p>";
    
    }

// Captcha
    
$Fehler = ["sicher"=>""];
    if (isset(
$_POST["submit"])) {
    
$Fehler["sicherheit"] = (md5($_POST["zip"]) != $_POST["zip2"]) ? "Die Rechenaufgabe ist leider falsch!" "";
    }

// Rechenaufgabe
    
$array = [1=>"eins""zwei""drei""vier""fünf""sechs""sieben""acht""neun",    "zehn""elf""zwölf""dreizehn""vierzehn""fünfzehn""sechzehn""siebzen""achtzehn"];
    
$Z1 mt_rand(19);
    
$Z2 mt_rand(19);
    
$Spam " + " $Z2 " = " $array[($Z1 $Z2)];
    
$Schutz md5($Z1);
?>

<form action="index.php" method="post" accept-charset="UTF-8">
<p>
 <label>Benutzername: <span class="pflichtfeld">*</span> <br>
 <input type="text" name="benutzername" class="lab1" required="required"></label>
</p>
<p>
 <label>Passwort: <span class="pflichtfeld">*</span> <br>
 <input type="password" name="passwort" class="lab1" required="required"></label> 
</p>
<p><label> Sicherheitsabfrage: 
 <span class="pflichtfeld">* <?=$Fehler["sicher"?></span><br>
 <input type="text" name="zip" class="labliste" required="required" autocomplete="off"><em><?=$Spam ?></em>
 </label>
 <input type="hidden" name="zip2" value="<?=$Schutz ?>">
 <br><span class="hilfetext"> Bitte lösen Sie die Rechenaufgabe.</span></p>
<p> 
  <input type="submit" name="submit" class="lab3" value="submit">
</p> 
</form>
</div>
</script>
</body>
</html>


Ich checks nicht, was ich falsch mach, wäre um jeden Denkanstoß dankbar.
Werner schrieb am Dienstag, den 26 September 2017 #5
Hallo Peter,
zuerst einmal solltest du beim programmieren die Ausgabe von Fehlermeldungen einschalten (error_reporting(E_ALL); )
Dieser Fehler würde dann erscheinen: Warning: Cannot add header information - header was already sent in ...
header()-Weiterleitungen müssen vor jeglicher Ausgabe (<html> ...) an den Browser stattfinden.
Das ganze ist jetzt ungetestet, nur so aus dem Kopf heraus, so wie ich das machen würde:

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
<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);

session_start();

if (isset(
$_SESSION['user_id']) ) {
 
header("Location: datenverwaltung.php");
}

$status '';

if (
$_SERVER["REQUEST_METHOD"] == "POST") {

 if (!empty(
$_POST['benutzername']) &&
     !empty(
$_POST['passwort']) &&
     !empty(
$_POST['zip'])) {

  
// Captcha überprüfen
  
if (md5($_POST["zip"]) == $_POST["zip2"]) {

   require_once 
"../blabla/connect.php";
   
$log $db->prepare("SELECT `benutzername`, `passwort`
   FROM `user`
   WHERE `benutzername` = :benutzername");
   
$log->bindParam(':benutzername'$_POST['benutzername']);
   
$log->execute();
   
$results $log->fetch(PDO::FETCH_ASSOC);

   
// Passwort überprüfen
   
if (count($results) > &&
       
password_verify($_POST['passwort'], $results['passwort']) ) {
    
$_SESSION['user_id'] = $results['benutzername'];
    
header("Location: datenverwaltung.php");
   }
   else {
    
$status '<p class="ko">Benutzername oder Passwort ist ungültig.</p>';
   }
  }
  else {
   
$status '<p class="ko">Die Rechenaufgabe ist leider falsch!</p>';
  }
 }
 else {
  
$status '<p class="ko">Bitte alle Felder ausfüllen!</p>';
 }
}

// Rechenaufgabe
$array = [1=>"eins""zwei""drei""vier""fünf""sechs""sieben""acht""neun",    "zehn""elf""zwölf""dreizehn""vierzehn""fünfzehn""sechzehn""siebzen""achtzehn"];
$Z1 mt_rand(19);
$Z2 mt_rand(19);
$Spam " + " $Z2 " = " $array[($Z1 $Z2)];
$Schutz md5($Z1);
?>
<!DOCTYPE html>
<html lang="de-at">
<head>
<meta charset="UTF-8">
<title>Anmeldung</title>
<meta name="robots" content="noindex">
<link rel="stylesheet" media="all" href="../css/glossar.css">
</head>
<body>

<div id="main">
<h1>Anmeldung</h1>

<?=$status ?>

<form action="index.php" method="post" accept-charset="UTF-8">
<p>
 <label>Benutzername: <span class="pflichtfeld">*</span> <br>
 <input type="text" name="benutzername" class="lab1" required="required"></label>
</p>
<p>
 <label>Passwort: <span class="pflichtfeld">*</span> <br>
 <input type="password" name="passwort" class="lab1" required="required"></label> 
</p>
<p><label> Sicherheitsabfrage: 
<span class="pflichtfeld">*</span><br>
 <input type="text" name="zip" class="labliste" required="required" autocomplete="off"><em><?=$Spam ?></em>
 </label>
 <input type="hidden" name="zip2" value="<?=$Schutz ?>">
 <br><span class="hilfetext"> Bitte lösen Sie die Rechenaufgabe.</span></p>
<p> 
<input type="submit" name="submit" class="lab3" value="submit">
</p> 
</form>
</div>

</body>
</html>
Peter schrieb am Mittwoch, den 27 September 2017 #6
Servus Werner;

Danke - dein Code funktioniert einwandfrei. Entschuldige die etwas verspätete Antwort, aber ich gehe die Codes immer Zeile für Zeile durch, um diesen zu verstehen und dabei zu lernen.

Ich habe die Verbindung zur Datenbank bei meinen Lernbeispielen immer an den Anfang gesetzt. Ist es grundsätzlich besser, die Verbindung zur DB erst aufzubauen, wenn sie tatsächlich benötigt wird, oder ist es egal?


Vielen Dank nochmals und Beste Grüße,
Peter
Werner schrieb am Mittwoch, den 27 September 2017 #7
Hallo Peter,
ich würde die Verbindung zur Datenbank erst setzen wenn diese benötigt wird.

<?php
session_start();
require_once "../blabla/connect.php";
?>
....
<?php
if(isset($_SESSION['user_id']) ){
header("Location: datenverwaltung.php");
}

Wozu die DB-Verbindung aufbauen wenn der angemeldete Benutzer sowieso auf eine andere Seite geleitet wird.
Peter schrieb am Mittwoch, den 27 September 2017 #8
Servus Werner,
ja da hast du einen guten Punkt angesprochen.

Danke für die Info und Beste Grüße,
Peter
schokocrossie schrieb am Samstag, den 7 Oktober 2017 #9
wenn man Ihre Systeme unverändert verwendet (mit oder ohne Datenbank), klappt alles super.
Sobald ich aber versuche Ihre Pagination-Vorschläge anders anzuwenden, geht nichts mehr oder es wird alles mögliche angezeigt, was ungewollt ist.
Fakt ist: ich habe eine PHP-Seite mit einer JS-gesteuerten Klappfunktion (ähnlich wir Ihre Linkliste).
Meine Beiträge kommen nicht aus einer Datenbank und werden innerhalb eines Klappthreads angezeigt (<dt>anklickbarer KLAPPTHREAD</dt> <dd> Inhalt </dd>), alles passt und funzt soweit!
Nun habe ich aber 20 - 50 Klappthreads auf einer Seite und möchte davon nur max. 5 pro Seite anzeigen.
Mein Problem: ich bekomme das weder über meine Klapp.js datei, noch über Ihre Vorschläge, noch über eine externe pagination.js gebacken.
Die Ergebnisse sind teils verheerend oder gleich null - fazit: heulganzdoll ^^ ich brauche vllt. nur einen Anschubser?
Werner schrieb am Montag, den 9 Oktober 2017 #10
Speichere deine "Klappthreads" in einer externen Datei ("klappthreads.txt"). Füge nach jedem "Klappthread" ein Trennzeichen ein (zb. einen Mittelstrich |)
Lese die Datei mit: $daten = file_get_contents("klappthreads.txt"); ein und erzeuge ein Array mit: $klapp = explode("|", $daten);
und gebe die gewünschten "Klappthreads" mit: echo $klapp[2] . $klapp[5] . $klapp[7]; aus.