Der Vorteil von SQLite ist, das die Datenbank eine Text-Datei ist und keine
Verbindung zu einem Datenbank-Server benötigt. Ideal für kleinere Datenmengen
oder wenn die Datenbank transportabel sein soll.
Live-Demo - Nachrichten
➤
Wer schon Erfahrung mit einer Datenbank und PDO hat, für den ist das eintragen / bearbeiten der Daten ein alter Hut (hej!)
Alle anderen sollten den Artikel » Erster Eintrag in eine MySQL-Datenbank mit PHP
lesen, da viele der Anweisungen im Script dort beschrieben werden.
Verbindung zur Datenbank
Hier wird eine Verbindung zur Datei: datenbank.sqt hergestellt.
Ist die Datei nicht vorhanden so wird diese angelegt. Des weiteren werden die Schreibrechte der Datei geprüft und
evtl. korrigiert.
// Pfad zur Datenbank
$datenbank = "db/datenbank.db";
// Anzahl der Datensätze (Nachrichten) pro Seite
$DatensaetzeSeite = 3; // 3
// Länge des minimalen Suchbegriffs (in Zeichen)
$suchbegriffMin = 4; // 4
// Max. Anzahl der Ergebnisse in der Suche
$sucheMaxErgebnisse = 35; // 35
/* Datenbank-Datei erstellen
https://www.sqlite.org/datatype3.html */
if (!file_exists($datenbank)) {
$db = new PDO('sqlite:' . $datenbank);
$db->exec("CREATE TABLE nachrichten(
id INTEGER PRIMARY KEY AUTOINCREMENT,
titel TEXT NOT NULL,
autor TEXT NOT NULL,
nachricht TEXT NOT NULL,
anzeige INTEGER NOT NULL,
datum TEXT NOT NULL)");
} else {
// Verbindung
$db = new PDO('sqlite:' . $datenbank);
}
define("FORMATIERUNG", '<details> <summary>Formatierung</summary> <pre id="format"> Audio-Datei <code id="audio">[audio=<b>url</b>]Titeltext[/audio]</code> b = <b>Fettschrift</b><code id="b">[b]Text[/b]</code> Bild / Grafik = 🎭<code id="url">[img=<b>url</b>]Titeltext[/img]</code> <span style="background:yellow">Hintergrundfarbe</span><code id="bcolor">[bcolor=<b>yellow</b>]Text[/bcolor]</code> i = <i>kursiv</i><code id="i">[i]Text[/i]</code> li = • Listenelement <code id="li">[li]Text[/li]</code> ol = Geordnete Liste <code id="ol">[ol]Text[/ol]</code> q = <q>Zitat</q><code id="q">[q]Text[/q]</code> s = <s>Durchgestrichen</s><code id="s">[s]Text[/s]</code> sub = <sub>Tiefgestellt</sub><code id="sub">[sub]Text[/sub]</code> sup = <sup>Hochgestellt</sup><code id="sup">[sup]Text[/sup]</code> <span style="color:#FF12345">Textfarbe</span><code id="color">[color=<b>red</b>]Text[/color]</code> u = <u>Unterstrichen</u><code id="u">[u]Text[/u]</code> ul = Ungeordnete Liste <code id="ul">[ul]Text[/ul]</code> Video-Datei <code id="video">[video=<b>url</b>]Titeltext[/video]</code> </pre> </details>');
➤
Bitte nehmen Sie per Hand keine Änderungen an der Datei: "datenbank.sqt" vor (enthält zum Teil unsichtbare Steuerzeichen),
da dadurch die Datei unbrauchbar werden kann!
Bearbeiten können Sie diese Datei zum Beispiel mit dem Programm:
DB Browser for SQLite
Nachricht eintragen
Die Daten werden über ein Formular in die Datei eintragen.
// Session vor jeglicher Ausgabe starten
session_start();
// Verbindung zur Datenbank aufbauen
include "verbinden.php";
// Vorschau
if (isset($_GET["vorschau"])) {
if (!empty($_POST["nachricht"])) {
echo format($_POST["nachricht"]);
}
exit;
}
// Benutzername gesetzt
if (!isset($_SESSION["benutzername"])) {
// Zur Anmeldung weiterleiten
header("Location: anmelden.php");
exit;
}
// Überprüfen ob das Formular versendet wurde.
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Die Nachricht vom Admin. sofort anzeigen
$anzeige = $_SESSION["benutzername"] == $ADMINISTRATOR ? 1 : 0;
/* prepare() bereitet die Anweisung für die Ausführung vor.
Die Platzhalter werden hier anstatt den POST-Variablen eingesetzt. */
$insert = $db->prepare("INSERT INTO nachrichten
(`titel`, `autor`, `nachricht`, `anzeige`, `datum`)
VALUES (:titel, :autor, :nachricht, :anzeige, :datum)") or sqlFehler($db->errorInfo()[2]);
/* Die Platzhalter werden mit $insert->bindValue() durch den
Inhalt der POST-Variablen ersetzt und maskiert. */
$insert->bindValue(':titel', $_POST["titel"]);
$insert->bindValue(':autor', $_SESSION["benutzername"]);
$insert->bindValue(':nachricht', $_POST["nachricht"]);
$insert->bindValue(':anzeige', $anzeige);
$insert->bindValue(':datum', date("Y-m-d H:i:s"));
/* $insert->execute() führt die vorbereitete Anweisung aus.
Bei einem erfolgreichen Eintrag wird 'true' zurück gegeben. */
if ($insert->execute()) {
// Meldung: Nachricht wurde eingetragen
if (isset($_GET["eingetragen"])) {
$ausgabe .= '<p class="status_ok">✔ Die Nachricht wurde eingetragen.</p>';
}
// Meldung: Erfolgreiche Abmeldung
if (isset($_GET["abmeldung_ok"])) {
$ausgabe .= '<p class="status_ok">✔ Sie wurden erfolgreich abgemeldet.</p>';
}
// Anzahl der Datensätze ermitteln
$select = $db->query("SELECT `id` FROM `nachrichten`" .
(!isset($_SESSION["benutzername"]) ? "WHERE `anzeige` = '1'" : "")) or sqlFehler($db->errorInfo()[2]);
$AnzahlDatensaetze = count($select->fetchAll());
// 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";
// Nachricht bearbeiten
if (isset($_GET["id"], $_SESSION["benutzername"])) {
/* Eine Nachricht auslesen
prepare() bereitet die Anweisung für die Ausführung vor. */
$select = $db->prepare("SELECT `id`, `titel`, `autor`, `nachricht`, `anzeige`, `datum`
FROM `nachrichten`
WHERE `id` = :id") or sqlFehler($db->errorInfo()[2]);
// $select->execute(array) führt die vorbereitete Anweisung aus.
$select->execute([':id' =>$_GET["id"]]);
// $select->fetch() holt die Zeile aus dem Ergebnis.
$nachricht = $select->fetch();
// Die gespeicherte ID vergleichen
if ($nachricht["id"] == $_GET["id"]) {
// Nachricht aktualisieren
if ($_POST["option"] == 'edit') {
/* Der Variable: $anzeige einen Wert zuweisen, entweder 1 oder 0.
Je nachdem ob die Checkbox gesetzt (ausgewählt) wurde. */
$anzeige = isset($_POST["anzeige"]) ? 1 : 0;
// prepare() bereitet die Anweisung für die Ausführung vor.
$update = $db->prepare("UPDATE `nachrichten`
SET
`titel` = :titel,
`nachricht` = :nachricht,
`anzeige` = :anzeige,
`datum` = :datum
WHERE
`id` = :id") or sqlFehler($db->errorInfo()[2]);
/* $update->bindValue() bindet einen Wert an den angegebenen Variablennamen
(die Platzhalter werden mit den POST-Variablen ersetzt). */
$update->bindValue(':titel', $_POST["titel"]);
$update->bindValue(':nachricht', $_POST["nachricht"]);
$update->bindValue(':anzeige', $anzeige);
$update->bindValue(':datum', $_POST["datum"] . ' ' . $_POST["uhr"]);
$update->bindValue(':id', $_POST["id"]);
// $update->execute() führt die vorbereitete Anweisung aus.
if ($update->execute()) {
$ausgabe .= '<p class="status_ok">✔ Die Nachricht wurde aktualisiert.</p>';
}
}
// Nachricht löschen
if ($_POST["option"] == 'delete') {
// prepare() bereitet die Anweisung für die Ausführung vor.
$delete = $db->prepare("DELETE FROM `nachrichten`
WHERE `id` = :id") or sqlFehler($db->errorInfo()[2]);
// $delete->execute(array) führt die Anweisung aus.
if ($delete->execute([':id' =>$_POST["id"]])) {
$ausgabe .= '<p class="status_ok">✔ Die Nachricht wurde gelöscht.</p>';
}
}
} else {
$ausgabe .= '<p class="status_ko">✖ Keine Berechtigung die Nachricht zu bearbeiten!</p>';
}
}
/* Alle Datensätze auslesen die in der DB-Spalte `anzeige` den Wert 1 haben.
Mit LIMIT die Ausgabe der Datensätze begrenzen (Versatz und Datensätze pro Seite). */
$select = $db->prepare("SELECT `id`, `titel`, `autor`, `nachricht`, `datum`, `anzeige`
FROM `nachrichten`
" . (!isset($_SESSION["benutzername"]) ? "WHERE `anzeige` = '1'" : "") . "
ORDER BY `datum` DESC
LIMIT :versatz, :DatensaetzeSeite") or sqlFehler($db->errorInfo()[2]);
// Hier ist es wichtig, das die Platzhalter und der Wert über bindParam() gesetzt werden.
$select->bindParam(':versatz', $Versatz, PDO::PARAM_INT);
$select->bindParam(':DatensaetzeSeite', $DatensaetzeSeite, PDO::PARAM_INT);
$select->execute();
$nachrichten = $select->fetchAll();
// Ausgabe über eine Foreach-Schleife
foreach ($nachrichten as $nr =>$nachricht) {
// Mit sscanf() wird das Format des Datums in die Variablen $jahr, $monat und $tag extrahiert.
sscanf($nachricht["datum"], "%4s-%2s-%2s %5s", $jahr, $monat, $tag, $uhr);
Was fehlt in diesem Script noch?
Zum Beispiel eine Funktion mit der man die Nachrichten in verschiedene Kategorien unterteilen kann.
Wie das funktioniert finden Sie unter: Erster Eintrag in eine MySQL-Datenbank mit PHP