Der Martin: Datenbank für GB

Beitrag lesen

Hi,

hab nicht allzu viel erfahrung in PHP hab es aber trotzdem zu einem GB für meine Seite geschafft, ...

GB? Gigabyte?

doch nun hab ich das Problem, dass die Alten Einträge zuerst erscheinen, weil die neuen Einträge immer ans Ende der Datenbank geschrieben werden

also so, wie es sich eigentlich intuitiv gehört: Die Liste wird von oben nach unten kontinuierlich fortgeschrieben. Die umgekehrte Reihenfolge, die man oft antrifft, kommt mir widernatürlich vor.
Aber da du (wie ich weiter unten sehe) gar keine Datenbank verwendest, sondern einfach eine Datei, an die die Einträge immer nur angehängt werden, ist dieses Verhalten völlig logisch.

if ($_POST[name]=="" || $_POST[email]=="" || $_POST[eintrag]=="")

Diese Zeile müsste drei Fehlermeldungen (Notices) produzieren, weil du vermutlich keine Konstanten mit den Namen name, email und eintrag definiert hast. Du meinst eigentlich

$_POST['name'], $_POST['email'], $_POST['eintrag']

echo "<h2>Bitte alle Felder ausfüllen!</h2>";

Ist eine solche Aufforderung eine Überschrift zweiter Ordnung? Das passt irgendwie nicht in meine Vorstellung einer schlüssigen Dokumentstruktur.

include "http://sthedwig-koblenz.de/Pfarrei/EintragenNeu.php";

Das ist vermutlich aus zwei Gründen falsch: Die eingefügte Ressource EintragenNeu.php liegt doch bestimmt auf demselben Server wie das übergeordnete Script. Dann ist es Unsinn, ein weiteres Script per HTTP einzubinden. Das hat vor allem den Nebeneffekt, dass die zwei Scripte keinen gemeinsamen Kontext haben, weil EintragenNeu.php isoliert als eigenständiger Aufruf ausgeführt wird und nur *dessen Ausgabe* wieder eingebunden wird.
Wahrscheinlich willst du EintragenNeu.php einfach als Datei einbinden.

Nebenbei bemerkt ist es gefährlich, gemischte Groß- und Kleinschreibung zu verwenden. Unix-basierte Systeme, unter denen die meisten Webserver laufen, unterscheiden bei Dateinamen peinlich genau zwischen Groß- und Kleinschreibung; als jahrelanger Windows-User, der das nicht gewöhnt ist, schießt man sich damit leicht ins Knie. Es hat sich (auch aus diesem Grund) als Konvention etabliert, Datei- und Verzeichnisnamen konsequent in Kleinbuchstaben zu schreiben.

echo "<h2>Eintrag erfolgreich!</h2>";

Siehe oben.

$eintrag = $_POST [eintrag];

Siehe oben.

$eintrag = str_replace("<","",$eintrag);
$eintrag = str_replace(">","",$eintrag);

Warum willst du hier (VOR dem Speichern) die Symbole '<' und '>' löschen? Das wäre erst sinnvoll, wenn du die Einträge wieder im HTML-Kontext ausgibst. Und dann wäre die PHP-Funktion htmlspecialchars() anstelle dieser beiden replace-Aufrufe dein Freund, denn damit bleiben diese Zeichen im Text erhalten und werden nur HTML-konform maskiert.
An dieser Stelle musst du die Daten nur für den Kontext maskieren bzw. umcodieren, in den du sie bringen willst. Für das Eintragen in eine MySQL-Datenbank wäre z.B. mysql_real_escape_string() angebracht. Da du aber eine gewöhnliche Textdatei verwendest, die so ziemlich alles enthalten darf, hängt die richtige Maskierung davon ab, wie du selbst deine Daten in dieser Datei strukturierst. Beispielsweise könnte es günstig sein, alle Zeilenumbrüche "\n" im Eingabetext durch die Zeichenfolge '\n' zu ersetzen und dann für jeden Eintrag eine Zeile vorzusehen.

$date_aktuell = strftime("%d.%m.%Y %H:%M");

$daten= "<hr><h2><a href=mailto:".$_POST[email].">".$_POST[name]."</a>, ".$date_aktuell.":</h2><gb>".$eintrag."</gb><br><br>";

$datenbank = "daten.dat";

$datei = fopen($datenbank,"a"); // hier muss glaub ich was geändert werden

fwrite($datei, $daten);

Dein ungünstiges Konzept setzt sich fort: Du speicherst alle Einträge als fertig aufbereitetes HTML. Was ist, wenn sich die Art der Darstellung mal ändern soll? Oder die Einträge gar nicht als HTML, sondern z.B. als Excel-Tabelle aufbereitet werden sollen? Dann sind die Einträge in ihrer momentanen Form unbrauchbar bzw. müssen erst wieder aufwendig analysiert und umcodiert werden.
Versuche grundsätzlich, wo immer möglich deine Daten in einem neutralen Format zu speichern. Hier würde sich, wenn man schon eine einfache Textdatei anstatt einer "richtigen" Datenbank nehmen möchte, wirklich Plain-Text anbieten. Ein Eintrag pro Zeile, jede Zeile nach dem Muster

Timestamp [Trennzeichen] Mailadresse [Trennzeichen] Name [Trennzeichen] Text

Dann musst du nur dafür sorgen, dass der Zeilenumbruch nicht im Text vorkommt, wie ich oben schon schrieb.

Die geeignete Aufbereitung für die *Anzeige* der Daten machst du dann erst beim Auslesen der gespeicherten Einträge.

$datenbank = "http://sthedwig-koblenz.de/Pfarrei/daten.dat";
$datei = fopen($datenbank,"r");

Auch hier wieder: Nicht über HTTP zugreifen (ist in vielen PHP-Installationen sogar blockiert), sondern direkt auf Dateiebene.

fpassthru($datei);

Und dann fehlt ein fclose($datei). Das erledigt PHP zwar für dich, wenn das Script beendet wird; es gehört sich aber im Interesse "sauberer" Programmierung, selbst für solche Aufräumarbeiten zu sorgen.

Übrigens gibt es noch die Funktion readfile(), die genau diese Kombination von fopen(), fpassthru() und fclose() in einem Aufwasch macht.

Also, denk nochmal über das grundsätzliche Konzept nach und versuche, etwas mehr System hineinzubringen. Wenn's irgendwo hakt, kannst du gern nochmal hier nachfragen - wir freuen uns, wenn jemand bereitwillig mitmacht und etwas dabei lernen möchte.

Schönes Wochenende noch,
 Martin

--
Heutzutage gilt ein Mann schon dann als Gentleman, wenn er wenigstens die Zigarette aus dem Mund nimmt, bevor er eine Frau küsst.
  (Barbra Streisand, US-Schauspielerin)