[PHP] Website komplett aus Datenbank

BF1942 Freak

Cadet 4th Year
Registriert
Mai 2005
Beiträge
73
Hallo!

Ich möchte eine Webseite erstellen, dessen Inhalt komplett aus einer Datenbank kommt, d.h. keine einzlnen HTML-, PHP- oder Sonstwas-Dateien.
Da ich allerdings sowas noch nie gemacht habe möchte ich mir euren Rat einholen.
Also ich hab mir da mal so paar Gedanken gemacht.
Ich schilder einfach mal, wie ich mir das Gedachte habe und ich wäre dann dankbar, wenn jemand sagen würde: "ja, das geht so" oder "nee, normalerweise löst man das problem auf eine ganz andere Art und Weise.
ALso ich hab mir das so gedacht:
Die Tabelle die die Website enthält soll ungefähr so aussehen.


Code:
+-----------------+-----------------+--------------------+
|    category     |      page       |      content       |
+-----------------+-----------------+--------------------+
+-----------------+-----------------+--------------------+
|      home       |      index      | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
|      home       |     contact     | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
|      home       |     impress     | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
|     scripts     |     counter     | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
|     scripts     |    guestbook    | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
|     scripts     |   imageviewer   | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
| interactivities |    guestbook    | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+
| interactivities |      forum      | <p>pla bla pla</p> |
+-----------------+-----------------+--------------------+


abgerufen wird das ganze dann über GET-Variablen.

Bspw. bei index.php?cat=interactivities&page=guestbook würde das gästebuch angezeigt, zusammen mit der "interactivities-Navigation".
(je nach Kategorie soll nämlich auch eine andere navigation erscheinen.)

Ist meine Idee ganz sinnvoll oder wird das in der Praxis ganz anders gelöst?

lg, der bf1942 freak :D
 
Generell wird das sehr oft praktiziert. Blogs, CMS-Systeme usw. Generell ist das wie du es machst gar nicht so verkehrt, nur macht z.B. das "cat=interactivities" keinen Sinn, dass du es über die GET-Variable mit überträgst, weil du das ja dann aus der DB auslesen kannst. Außerdem solltest du dir der Übersicht halber zu jedem Eintrag eine ID fest legen. Auch könntest du die Kategorien im Sinne der Normalisierung in eine eigene Tabelle auszulagern, und dann über eine ID verbinden.

Sonst sieht das schon gar nicht so verkehrt aus :D
 
Stimmt, hast recht, ?page=xy reicht auch schon.
aber was würds mir denn bringen, die kategorien in eine extra tabelle zu packen?
 
Das was man immer mit Normaliseriung will: Übersicht in einer Datenbank, geringe bis keine Redundanz (doppelte Datensätze) und mehr Flexibiltät.
Speziell für dein Beispiel:
Du willst den Bereich "home" zum Beispiel zu "index" oder "main" umbennen. So wie es jetzt ist, musst du das ganze in drei Datensätzen ändern. Wenn du jetzt aber statt der konkreten Kategegorie eine Zahl stehen hättest (z.B. 2) und ein einer anderen Tabelle dann die Zuordnung hättest (2-> "home", 3->"scripts" usw.) müsstest du nur in dieser Tablle einen Wert ändern anstatt drei. Bei drei Datensätzen kann mehr schief gehen als bei einem :D.
In deinem Fall mag das zwar nicht gerade so sehr gravierend sein, aber wenn du größere Projekte hast (Foren o.ä.) geht es nicht mehr wenn die Datenbank nicht normaliesiert ist.

gruß
bassti
 
Selbst wenn der Content in der Datenbank steht, ohne php dateien (oder auch asp(x) oder pl) kriegst du den nicht ausgelesen. Das Design, also den HTML-Code würde ich in Templates legen und den Content und das Design beim Auslesen der Daten verknüpfen. Wenn du sowas noch garnicht gemacht hast empfiehlt es sich dringend, ein Tutorial zum Thema zu lesen oder ein geeignetes Buch. Weil sonst wird das nix :D
 
ja ach nee

aber an index.php?cat=interactivities&page=guestbook kann man jawohl erkennen, dass ich eine php datei eingeplant habe.

ich schrieb^^:
d.h. keine einzlnen HTML-, PHP- oder Sonstwas-Dateien.

mit keine einzelnen meinte ich nicht, dass ich komplett ohne auskommen will.
sondern halt nur das ich nicht 100 einzelne dateien habe.
 
Selbst wenn du 10-30 PHP Dateien brauchst tut das der Seite wohl keinen Abbruch. Teilweise kommt man halt nicht drumrum, Code oder Content in andere Dateien auszulagern.
 
Eine Frage am Rande: Ist dieses Projekt als Hobby gedacht oder willst du CMS neu erfinden?
Wenn es einfach nur um eine Lösung für eine Website geht, würde ich mir lieber die gängigen CMSs anschauen und daraus etwas weiterentwickeln.
 
Ich habe noch eine Frage:
Wenn ich jetzt auf einer Seite ein Kontakt-Formular oder ein Gästebuch habe...
Diese Seiten enthalten dann natürlich auch PHP-Code.
Wenn allerdings der PHP-Code wie alles andere in der Datenbank steht, dann ausgelesen, in eine Variable ($content) geschrieben und im HTML-Template ausgegeben wird, wird der PHP-Code ja gar nicht geparst, sondern einfach so ausgegeben. Gibt's vielleicht irgendeine Funktion, mit der ich die Variable $content bzw. ihren Inhalt durch den PHP-Parser schicken kann?
 
ah, vielen dank :)
gibt es auch eine funktion, mit der man prüfen kann, ob ein string php code ist?
 
Zuletzt bearbeitet:
Warum um Himmels willen willst du Applikationslogik in die Datenbank auslagern?

greetings, Keita
 
naja joa.. :)
wie gesagt, ich hab jetzt zwei tabellen, so ähnlich wie oben beschrieben.
und der inhalt der seite steht ja auch in der datenbank.
aber jetzt zum beispiel bei der seite Kontakt: da gehört zum seiteninhalt ja auch php-code. der teil, der das formular dann versendet.
oder wie löst man sowas normalerweise? :)
 
Inhalte sind Daten, der Code für den Versand des Formulars ist Applikationslogik. In die DB wandert also das Formular selbst, die Logik kommt in PHP-Skripte und wird nur beim Versand des Formulars ausgeführt.
Damit das funktioniert, muß in der DB ein entsprechender Vermerk gespeichert werden oder das Formular sendet einen Vermerk, damit die Logik bei Bedarf eingebunden/ausgeführt wird.

greetings, Keita
 
aber wenn ich include(formmailer.php); reinschreiben würde hätte ich doch immernoch das problem, dass er in manchen fällen, das, was durch aus der datenbank ausgelesen wird, noch durch den php parser schicken soll.

und wenn ich den formmailer über <form action="formmailer.php" .... > einbinden würde, dann hätte ich das problem, dass der user von der eigentlichen seite weggebracht wird.

oder gibts noch ne möglichkeit?
 
Nicht der Content bindet formmailer.php ein, sondern die index.php. Der Content teilt der index.php lediglich (wie auch immer) mit, daß sie formmailer.php einbinden muß und daß die eintrudelnden Daten von der formmailer-Funktion/Klasse verwurstet werden sollen.

Als Zieladresse für das Formular nimmt man je nach httpd bspw. $_SERVER['REQUEST_URI'], die den Pfad und Query der Anfrage-URL enthält:

Code:
<form action=<?php echo htmlSpecialChars($_SERVER['REQUEST_URI']); ?>" methode="post">
....
</form>

Auf diese Weise wird das Formular automatisch an sich selbst geschickt.

greetings, Keita
 
Ähm... Jetzt bin ich verwirrt.
Also nochmal ganz langsam... :)
Ich zeig dir jetzt erst einmal meinen Code:
PHP:
/* Auslesen des Inhalts der jeweiligen Seite aus der Datenbank */
$sql = "SELECT content
        FROM pages
        WHERE cat = '$cat_id' AND page = '$page'";
$result = @mysql_query($sql);
$row = @mysql_fetch_assoc($result);
$content = $row['content'];

. . . Template . . .

<div id="content_box">
  <?php
  /* Ausgabe des Inhalts der Seite */
  echo $content;
  ?>
</div>
Du sagst, dass nicht der Content, sondern die index.php die Formmailer-Funktion einbinden würde.
Ich hab dich jetzt so verstanden, dass ich dieses <form ... ></from> nicht in die Datenbank, sondern in die index.php schreiben soll. Aber das ist doch nicht möglich. Ich kann doch nicht <form ... ></form> in die index.php schreiben, denn das Formular wird ja nur auf einer Seite und nicht auf allen benötigt. Die Seite index.php ist aber für alle Seiten zuständig. Sie füllt die content_box immer mit dem entsprechenden Content aus der Datenbank.

:confused_alt:
 
Nein, <form/> ist Content und gehört entsprechend in die Datenbank, das Etwas, welches die Daten von <form/> verarbeitet, ist hingegen Logik und gehört nicht dorthin. Du könntest z.B. im Formular eine versteckte Anweisung mitschicken, welche von der index.php ausgewertet wird:

Content aus der DB:
Code:
<form ....>
<input name="proc" type="hidden" value="formmailer" />
...
</form>


index.php:
PHP:
/* Auslesen des Inhalts der jeweiligen Seite aus der Datenbank */
if (isset($_POST['proc'])) {
  switch ($_POST['proc']) {
    case 'formmailer':
      require_once 'formmailer.php';
      verwursten();
      verdauen();
      sonstirgendwas();
      break;

    case 'watweissichwatt':
      require_once 'wattweestenet.php';

    ...
  }
}

$sql = "SELECT content
        FROM pages
        WHERE cat = '$cat_id' AND page = '$page'";
$result = @mysql_query($sql);
$row = @mysql_fetch_assoc($result);
$content = $row['content'];

. . . Template . . .

<div id="content_box">
  <?php
  /* Ausgabe des Inhalts der Seite */
  echo $content;
  ?>
</div>


Natürlich bekommst du auf diese Weise bspw. $_SERVER['REQUEST_URI'] nicht als Wert des action-Attributs untergebracht, da $content nicht geparst wird, daher mußt du dir einen Platzhalter ausdenken, der anstelle des Wertes von $_SERVER['REQUEST_URI'] in action steht, und diesen durch $_SERVER['REQUEST_URI'] selbst substituieren:

Content aus der DB:
Code:
<form action="{REQUEST_URI}" ...>
...
</form>


index.php:
PHP:
<?php

  $content = str_replace('{REQUEST_URI}', $_SERVER['REQUEST_URI'], $content);

?>

greetings, Keita
 
Vielen Dank für die Ideen, Keita! :)
Ich bin schon relativ zufrieden mit meinem Ergebnis. Nur eine kleine Sache stört mich noch.
Und zwar geht es um die Trennung zwischen Programm-Code und HTML-Code.
Ich validiere die Eingaben aus dem Formular folgendermaßen:

PHP:
if (empty($firstname))
    {
        $error         = true;
        $errormessage .= "Bitte gib deinen Vorname ein!<br />";
    }
    elseif (strlen($firstname) < 3)
    {
        $error         = true;
        $errormessage .= "Dein Vorname ist zu kurz!<br />";
    }
    if (empty($lastname))
    {
        $error         = true;
        $errormessage .= "Bitte gib deinen Nachnamen ein!<br />";
    }
    elseif (strlen($lastname) < 3)
    {
        $error         = true;
        $errormessage .= "Dein Nachname ist zu kurz!<br />";
    }
    if (empty($email))
    {
        $error         = true;
        $errormessage .= "Bitte gib deine E-Mail-Adresse ein!<br />";
    }
    elseif (preg_match($email_pattern, $email) == 0)
    {
        $error         = true;
        $errormessage .= "Deine E-Mail-Adresse ist ung&uuml;ltig!<br />";
    }
    if (empty($message))
    {
        $error         = true;
        $errormessage .= "Bitte gib deine Nachricht ein!<br />";
    }
    elseif (strlen($message) < 10)
    {
        $error         = true;
        $errormessage .= "Deine Nachricht ist zu kurz!<br />";
    }

Tja, und genau diese kleinen <br />'s sind die kleinen Dinger, die mich noch stören, denn wenn die da weg wären, hätte ich wirklich überhaupt keinen HTML-Code mehr im Programm-Code.
Mein Template sieht folgendermaßen aus:

HTML:
<form action="{FORM_ACTION}" method="post">
  <p style="color: #800000">
    {FORM_ERRORMESSAGE}
  </p>
  <p>
    Vorname:<br />
    <input name="firstname" type="text" size="20" maxlength="20" value="{FORM_FIRSTNAME}" /><br />
    Nachname:<br />
    <input name="lastname" type="text" size="20" maxlength="20" value="{FORM_LASTNAME}" /><br />
    E-Mail-Adresse:<br />
    <input name="email" type="text" size="30" maxlength="50" value="{FORM_EMAIL}" />
  </p>
  <p>
    Nachricht:<br />
    <textarea name="message" cols="60" rows="10">{FORM_MESSAGE}</textarea>
  </p>
  <p>
    <input name="send" type="submit" value="Absenden" />
  </p>
</form>

Nun hatte ich mir schon überlegt, die Fehlermeldung in ein indiziertes Array zu schreiben und dann mit einer foreach-Schleife wieder auslesen zu lassen und dann bei jedem Durchgang ein <br /> hinten an die Fehlermeldung klatschen zu lassen. Nur dann ist das Problem, dass ich im Template wieder PHP-Code habe (die foreach-Schleife).
Wie ich das lösen, dass im Programm-Code keine HTML-Tag mehr sind und aber auch kein PHP-Code im Template?
 
Zurück
Oben