Eigenes cms - entwurfsvorchlag

hi leutz,
seit einiger Zeit befasse ich mich etwas näher mit Webseiten. Zuerst habe ich nur mit desingn (xhtml und css) angefangen, und seit Juli dises Jahres fange ich mit PHP und Mysql an. Mittlerweile bin ich bei der oop angelangt. Und da ich bisher kein wirklich schönes cms gefunden habe (bei z.B. cms made simple zu wenig einstellmöglichkeiten als programmierer, und Silverstripe ist dann wieder zu kompliziert), habe ich mir gedacht, da mache ich doch einfach ein eigenes cms. Dabei lerne ich zum einen besser programmieren, und zum anderen habe ich danach ein cms dass an meine Bedürfnisse angepasst ist. Das cms soll oop basiert sein.

mein bisheriger Enturwfsvorschlag ist:

Inhalt

der Inhalt der Seite wird in einer mysql Tabelle gespeichert, die folgendermaßen aussieht:

Id--------------zur identifikation der seiten
title------------der titel der Seite
title_nav-------der titel in der navigation
desc-----------die beschreibung, steht bei dem a tag in dem title attribut
parent---------wenn die seite eine unterseite ist, steht hier die id der obersiete
content--------der inhalt der seite
type-----------z.b. normal, gästebuch, oder weiterleitung
date-----------halt das datum wann die seite erstellt wurde

das feld date soll automatisch mit dem typ timestamp ausgefüllt werden, und das feld id soll einen primary key erhalten (mit autoincrement und so weiter und so fort)

Naviagtion am Beispiel einer Sirtemap

Hierbei werden zunächst alle Seiten ausgegegeben, bei denen das feld parent leer ist. Bei jeder ausgegebenen Seite wird geprüft, ob es Seiten gibt, die bei parent die id dieser seite haben. wenn ja, werden sie ausgegeben und bei jeder davon wird wieder geprüft ob es seiten gibt, die diese als parent haben.

Backend
Um sich ins Backend anzumelden, muss man ein Passwort eingeben, welches 2500 mal mit md5 verschlüsselt wird (1 mal ist ja heutzutage mit einem Brute Force angriff auf einer Gpu sehr schnell zu knacken), und dann in einer datenbanktabelle abgefragt wird. Ausserdem ist nur ein 3 maliger falscher versuch innerhalb 10 minuten mit der selben ip erlaubt.

Im backend kann man:

[ul]
[li]neue Seiten anlegen (einfach die Daten aus dem Formular in die tabelle speichern)[/li]
[li]einen newsletter schreiben[/li]
[li]ein Gästebuch verwalten (einträge ändern bzw löschen/veröffentlichen)[/li]
[li]Bilder aus Flickr in ein album auf der seite tun, wo automatisch ein Vorschaublid erstellt wird und eine Galeriefunktion mittels Lightbox realisiert wird, und eine kommentarfunktion implemenitert wird[/li][/ul]

Das Gästebuch soll mittels versteckter input Felder, einer Ip sperre und einer Sicherheitsabfrage (ist die sonne heiß oder kalt oder so…) vor spam geschützt werden.

Bei der Flickr implementierung soll man nur den namen des accounts und des albums oder so angeben müssen.

Die Url soll den Namen der Seite enthaltn und evtl. den Namen der Oberseite. Die Url wird mit mod rewrite geschützt. Wenn die Seite als typ z.b. Gästebuch hat, wird die Klasse Gästebuch aufgerufen, ansonsten wird einfach der Inhalt abgefragt.

Meine Frage ist nun, was ihr zu dem Entwurf zu sagen habt, z.B. was noch fehlt oder was ich anders machen sollte oder könnte. Z.b bin ich mir nicht sicher, ob ich den Inhalt in einer datenbank oder in dateien speichern soll.

P.s. ich habe versucht so viele Rechtschreibfehler wie möglich zu vermeiden, diese sind aber nicht auszuschließen, bitte habt verständnis dafür.

naja, nach ein paar monaten ist es eigentlich für ein CMS noch zu früh, es gehört viel dazu vor allem wegen Sicherheit aber auch Percormance und ein gutes Software design ist wichtig. Bei OOP sollte man dann schon Design Pattern einseitzen und nicht nur das Singelton oder Registry Muster, Datenbankabfragen müssen Optimiert werden, Profiling und Benchmarking sollte ein Thema sein und vieles mehr.
Ich weiß wovon ich spreche, ich bin seit 2 Monaten dran ein CMS zu schreiben und habe jetzt die Beta fertig.

Mehrmalige Anwendung von md5 verschlechtert eher die
Sicherheit, bzw verbessert sie nicht signifikant.
Bei einer ordentlichen Verzögerung bei einer falschen Eingabe
nutzt einem Angreifer da auch keine schnelle GPU.
Es fällt dem Angreifer allerdings leicht, ein bekanntes Nutzerkonto
effektiv zu sperren, indem ab und an ein Versuch durchgeführt
wird ;o)

Ansonsten ist OOP bei einfachen PHP-Skripten sicher
überflüssig und deutet eher an, daß man seine Bedürfnisse nicht
genau spezifizieren kann, was dann gerade bei PHP-Skripten
leicht ineffektiv wird.
Da ist wohl gut brauchbar, wenn man da mit einigen
Leuten und mit Arbeitsteilung an einem großen Projekt
sitzt. Wenn man aber alleine ein Projekt bearbeitet, was zudem
auch noch schnell und effektiv vor allem eine internet-Seite
ausgeben soll, so scheint mir das nicht die ideale Anwendung
zu sein. Zähe, langsame und unflexible CMS gibt es doch schon
genug.

Datenbank ist für das was da beschrieben wurde sicher auch
überflüssig und macht dann so zumindest den möglichen
Inhalt ziemlich unflexibel.
Wozu sollte man den Kram in eine Datenbank pappen, wenn
man ihn doch gleich in die Seite reinschreiben kann?

Scheint mir eher sinnvoll zu sein, mit dem Einsatz von wenig
PHP und viel originärem Inhalt ein Projekt zu erstellen, was ein
Thema hat, was nicht schon auf zig anderen Seiten erschöpfend
behandelt wurde und was wohlmöglich sogar einige Leute
interessieren könnte.

[quote=“hoffmann”]Ansonsten ist OOP bei einfachen PHP-Skripten sicher
überflüssig und deutet eher an, daß man seine Bedürfnisse nicht
genau spezifizieren kann, was dann gerade bei PHP-Skripten
leicht ineffektiv wird.[/quote]

daraus kann man schließen das du noch wie OO programmiert hast, OOP ist für ein ernsthaftes Projekt lebenswichtig. Wenn du wirklich den sinn verstanden hast wirst du ohne OOp nichtmal das kleinste Projekt machen. In PHP gibt es sogar möglichkeiten die nichtmal eine vollständig Objektorientierte Sprachen wie z.B.: Java bieten kann.

Wenn du OOP richtig einsetzt sparst du dir eine rießen haufen arbeit vor allem beim erweitern und ändern vorhandene Scripte. Fast alle guten Web CMS nutzen OOP viele als hilfsmittel (wegen kompatibilität zu PHP 4) aber auch einige wie WBB die vollständig Obejtorientiert sind.

Der Hash eines Hashes sind eindeutig nicht sicherer als der Hash davor.
Was sinnvoll ist, ist das Hashen mit Salt at2.php.net/crypt

Zum Thema OOP: OOP ist sinnvoll, und sicht gleichzeitig auch nicht sinnvoll. Vor allem wenn nie mehr als eine Instanz einer Klasse existiert rentiert sich das Objekt nicht wirklich. Vorteile sind natürlich die Übersichtlichkeit und die Sichtbarkeit von Members. Ein Nachteil ist zB aber auch die Performance.
Gut zu sehen ist das auch im Vergleich C & C++
C++ Code ist meißtens sauberer als C, allerdings kann man sich in den Klassen auch schnell verlaufen (Kommunikation, Threads)
OOP für PHP ist eig. nichtmal wirklich sinnvoll, weil Sichtbarkeit bzw. Erweiterbarkeit keine Rolle spielen.

Ich versuche auch gerade eine Webseite komplett in OOP zu programmieren, leider fehlt mir im Moment einfach die Zeit: phpbase.bplaced.net/code/page/static.php

ich kann euch nur den Tipp geben beschäftigt euch mal bissel mit Java, danach wollt ihr nie wieder etwas anderes asl OOp nehmen, in Java sind 99% aller mitgeliferten APIs wirklich perfekt Objektorientiert.

Dass das ziemlicher Unfug ist, schrieb hoffmann bereits - darüber hinaus:

MD5 ist nicht “schnell zu knacken”.

Was heutzutage ggf. möglich ist, ist Kollisionen zu finden - zwei unterschiedliche Werte, die den gleichen Hash-Wert ergeben. Aber auch das geht noch nicht so schnell, dass es sich für den Einbruch in ein CMS über diesen Weg lohnen würde.

Gegen Brute Force hilft dir dein System nicht im geringsten.
BF heisst, dass von aussen her versucht wird, durch “Ausprobieren” von Werten Zugang zu erhalten.

Wenn das Passwort “abc123” lautet, und ich beim brute-forcen gerade bei diesem Wert angekommen bin - dann ist es ganz egal, ob dein System meine Eingabe ein mal mit MD5 behandelt und mit dem ein mal per MD5 behandelten Original vergleicht, oder ob es meine Eingabe 2500x durch MD5 jagt, und dann mit dem 2500x durch MD5 gejagten Original vergleicht.

Also, ich will das cms wie schon gesagt zu Übungszwecken nutzen, und somit ist es glaube ich schon sinnvoll oop zu arbeiten. Denn wenn ich dies nicht tue, kann ich es auch gleich lassen mit dem cms anzufangen. Ausserdem bin ich zu dem Entschluss gekommen (durch stundenlanges googlen zum thema oop in php) das viele Leute die Objekt orientiert php programmieren darin das Gelbe vom Ei sehen, und das die Leute die es noch nicht so wirklich getan haben, eher dagegen sind. Diese Meinung kann völlig falsch sein, aber vor allem der Link: https://www.lima-city.de/thread/oop-in-php-1 hat mich überzeugt, besser ist oop zu können. Und vielicht werde ich irgendwann einmal mit Anderen zusammen etwas programmieren, und dann ist es doch gut oop zu können, oder nicht?


Also lasse ich die Verschlüsselung mit md5 weg, und verschlüssele das Passwort anders; aber der Link zu der Seite über Salt von michi7x7 geht nicht. Wird bei dieser methode nicht noch ein Zufallswert mit einbezogen, oder liege ich da falsch?

Und wenn ich das cms mit Dateien mache (soweit ich es verstanden habe, war hoffmanns vorschlag dass ich es so mache soll, wenn dies falsch ist, entschuldigung), wo z.B. jede Datei so aussieht:

<?php
include ("head.inc.php");
?>
der inahlt der seite....
<?php
include ("navi.inc.php");
include ("footer.inc.php");
?>

In diesem Fall sieht die Navigation z.b. immer gleich aus, und es gibt keine Möglichkeit, bei der aktuellen Seite einen Link mit der Klasse activelink oder so auszugeben. Wenn ich dies mit einer Datenbank mache, ist dies glauibe ich doch recht einfach zu bewerkstelligen.
Und ist eine Seite denn soviel langsamer, wenn ich den Inhalt immer aus einer Datenbank abfrage? Die gnazen anderen populären cms machen dies doch auch, so oder nicht?

nein ist nicht (merkbar) langsamer

Also kann ich eigentlich ohne Einschränkungen mysql verwenden, oder? (Ich versuche natürlich so wenige Abfragen wie möglich zu machen.)
P.s. Gibt es irgendeine Empfehlung, wie viele mysql Abfragen amn höchstens machen sollte?

nein.
ich hab bei meiner seite z.Z um die 10 abfragen pro seite mit nem beitrag.
andere systeme haben sicher noch mehr…

es kommt auf die abfragen an, oft ist es sinnvoll sehr komplizierte abfragen zuzerteilen, die erste abfrage sollte sowieso immer den verbindungszeichensatz angeben (das sinnvollste ist utf8), bei einem kleinen cms sind 10abfragen so der durchnitt, umso umfangreicher es wird könne es auch 30 und mehr werden, gerade bei komplizierten systemen für benutzerrechte sind 5 abfragen nicht viel.

naja für die rechte reichen eigentlich 2 abfragen^^

Ich habe noch kein eigenes CMS geschrieben, aber wenns denn ums programmieren geht - ich bin dafür, dass man übt professionell und effizient eine Lösung auf ein Problem zu finden und nicht dafür, dass man irgendetwas herstellt, das dann alle oder viele Probleme lösen soll - soll heißen, eine Lösung soll für ein einziges Problem da sein und nicht gleich für 50 - das heißt, arbeite so, dass du für ein/dein Problem eine sehr gute Lösung hast, und nicht eine mittelmäßige Lösung für 20 (potenzielle) Probleme.

Von Weglassen hat ja keiner geredet - nur vom mehrmaligen Anwenden der gleichen Hash-Funktion.
Ob man heutzutage MD5 hinsichtlich des Anspruchs in Bezug auf den vorliegenden Anwendungsfall noch für “gut” genug hält, mag jeder selbst überlegen - wem das nicht so erscheint, der kann ja SHA-1 o.ä. nehmen.

Ja, unter einem Salt versteht man in dem Umfeld einen ggf. zufälligen Text, der dem zu haschenden Wert noch hinzugefügt wird.
In einem Fall wir hier nimmt man üblicherweise einen festen Wert, den man im Script hinterlegt - es reicht ja, wenn der Angreifer von aussen ihn nicht kennt.
Das macht man vor allem deshalb, damit die gespeicherten, gehashten Versionen der Passwörter nicht mehr so viel Wert haben - wenn bspw. einem Aussenstehenden ein Dump der Tabellendaten in die Hände fällt, dann kann er mit MD5(‘passwordplusXKR13uxf3jhDfh7’) weniger anfangen, als mit MD5(‘password’) - denn letzteres kann er leicht in einer Hash-Tabelle nachschlagen, die die MD5-Werte von “häufigen” Wörtern vorhält, und password ist ja (unglücklicher Weise) ein häufig genommenes Passwort.

Ich hoffe aber, michis Link war nur in Bezug auf das Prinzip des “Salzens” an sich, und nicht speziell in Bezug auf crypt gemeint - denn das sollte man heutzutage nun wirklich nicht mehr nutzen.

Zum Datenbankproblem - Datenbanken sind vor allem sinnvoll,
wenn man komplexe korrelierte Daten hat, mit denen man bei
der Speicherung noch nicht genau weiß, was man damit machen
will oder die man unter verschiedenen Gesichtspunkten
durchsuchen oder in der Ausgabe kombinieren weiß, die man
bei der Erstellung des Datensatzes noch nicht kennt.

Hat man das nicht, braucht man sich auch nicht mit Datenbanken
zu beschäftigen.

Zu OOP - doch, ich habe da meine Bemühungen allerdings
schnell abgebrochen, weil ich irgendwie ohne das Zeug bei
meinen Anwendungen immer schon das Ergebnis des fertigen
Programmes ohne dies hatte, während man mit immer noch
dabei war, irgendwelche Klassen zu konstruieren, die man
nachher doch nie so allgemein braucht. Ging mir auch bei C
schon immer auf den Keks. Bei großen Projekten kann das
natürlich sehr hilfreich sein, keine Frage, aber eher nicht, wenn
man schnell mit einem kleinen Skript zum Ziel kommen will,
da programmiert man möglichst schlank und zielorientiert,
nicht unbedingt allgemein und wiederverwendbar.
Nicht umsonst haben heutige Programme gewaltige Ausmaße
und verbraten Unmengen an Speicher. Ähnlich Programme
paßten vor 20 Jahren noch auf eine Diskette und haben 1MB oder
weniger Arbeitsspeicher verbraucht. Ein guter Teil davon hängt
mit OOP zusammen, was zwar gut wiederverwertbar ist, aber
nicht besonders resourcenschonend. Gerade bei PHP, wo es darum
geht, möglichst sparsam mit Resource und Rechenleistung
umzugehen.

Bei dem dateibasierten Ansatz, natürlich kann man die Navigation
vom Inhalt abhängig machen. Muß man sein Skript eben nur
passend strukturieren. In der Navigation kann man ja auswerten,
was der aktuelle Inhalt ist und dann entsprechend die Ausgabe
zur Navigation modifizieren. Mache ich bei einigen Projekten in
der Form, weil es ja nicht sinnvoll ist, daß die Navigation einen
Verweis zur aktuellen Seite enthält, da tausche ich dann das
a-Element gegen strong oder sowas aus.

ich kann nur dazu eins sagen:
da ich auch aktuell am programmieren und am optimieren eines cms bin ist datenbankmäßig wirklich besser, man sollte aber zum optimieren einen dateibasierten cacher einbauen um die db nicht unnötig zu belasten und diesen bei änderung zu löschen.
Ein richtiges CMS ist zudem eine langwierige arbeit, bei der man nicht einfach mal so nebenbei anfangen kann.
man sollte schon einige erfahrung mit PHP und mysql gemacht haben.

also das ein cms lange dauert weiß ich auch, aber ich habe viel zeit (bin 10.klasse und habe mir vorgenommen spätestens ende 12. fertig zu sein^^) und umso schwieriger die aufgabe ist, umso mehr weiß ich und kann ich dann danach.

und soweit ich weiß sind datenbanken dafür da, um vile sachen mit den daten zu machen, z.b. absteigend sortieren oder so, was mit dateien nicht so leicht ist.

Hi,

ich finde dein Projekt ist sehr gut zum üben auch wenn du dir einiges vorgenommen hast. Und lass dich nicht von OOP abbringen. Wenn du üben willst dann direkt richtig. Und vielleicht willst du ja später auch mal was anderes Programmieren. Desktopanwendungen in einer anderen Programmiersprache zum Beispiel. Dann wirst du um OOP nicht mehr herumkommen. Große Programme sind so gut wie gar nicht umsetzbar. Programme lassen sich einfach besser strukturieren und dein Code wird leichter verwalltbar.
Was ich gar nicht verstehen kann ist das PHP-Programmierer OOP oft kritisch gegenüberstehen. Wenn du ein Problem hast, dass du immer wieder lösen musst, dann ist es doch besser es einmal in einer Klasse zu behandeln die du dann in deinem code mit ein paar Zeilen aufrufen kannst, als die Methoden mit Copy und Paste in ein anderes Script zu schreiben. Wenn du dann mal was an der Funktion ändern musst kannst du das in einer einzigen Klasse machen und brauchst nicht überall in deiner Seite danach zu suchen. Anders wären große Projekte (und ein CMS zähle ich dazu) nur mühseelig zu bearbeiten. Ich benutze zum Beispiel eine Klasse für meine Datenbankzugriffe.

<?php

/********************************************************************************************************************
 *
 *                                        				DB
 *
 *                                       Copyright (C) 2009 Marcel Melzig
 *
 *          This program is free software; you can redistribute it and/or modify it under the terms of the
 *          GNU General Public License as published by the Free Software Foundation; either version 3 of
 *          the License, or (at your option) any later version.
 *
 *          This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 *          without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *          See the GNU General Public License for more details.
 *
 *          You should have received a copy of the GNU General Public License along with this program;
 *          if not, see http://www.gnu.org/licenses/.
 *
 *********************************************************************************************************************/

include('connectionData.php'); //Importiert die Datei mit den Verbindungsdaten.

class DB
{
	// Speichert die Connection.
	private $Connection;

	public function __construct()
	{
		$this->Connection = $this->getConnection();
	}

	// �ffnet die Datenbankverbindung.
	public function getConnection()
	{
		$dbc = new PDO(ConnectionData::servertyp.":host=".ConnectionData::server.";dbname=".ConnectionData::db, ConnectionData::user, ConnectionData::password, array(PDO::ATTR_PERSISTENT => true));
		return $dbc;
	}

	// L�scht aus der Datenbank. �bergeben wird der Name der Tabelle aus der gel�scht werden soll und eine Liste mit Parametern.
	// Als Parameter wird ein Array mit Parametern �bergeben die mit dem Objekt SQLParameters erstellt wird.
	// Wird das Statement erfolgreich usgef�hrt gibt die Methode true zur�ck. Ansonsten false.
	public function deleteFromDB($tableName, $parameters)
	{
		$query = "DELETE FROM ".$tableName;
		$query .= " WHERE (1=1)";

		foreach($parameters as $parameter)
		$query .= " AND (".str_replace(':', '', $parameter->getParamName())." = ".$parameter->getParamName().")";

		if(executeStmt($query, $parameters))
		return true;
		else
		return false;
	}

	// Die Methode l�scht eine Tabelle aus der Datenbank. Kann die Tabelle gel�scht werden, gibt die Methode true
	// zur�ck. Ansonsten false.
	public function dropTable($tableName)
	{
		$query = "DROP TABLE ".$tableName;

		if(execute($query))
		return true;
		else
		return false;
	}

	// Die �berladene Methode execute f�hrt das Statement aus.
	public function execute($query)
	{
		executeStmt($query, array());
	}

	//Ist der 2te Parameter eine Array mit Parametern wird direkt die Methode executeStmt aufgerufen.
	//Andernfalls wird erst ein Array erstellt und der �bergebene Parameter in das Array eingetragen.
	public function executeOneParameter($query, $parameter)
	{
		if(is_array($parameter))
		executeStmt($query, $parameter);
		else
		{
			$tmpParams = array();
			$tmpParams[] = $parameter;
			executeStmt($query, $tmpParams);
		}
	}

	// Führt das Statement aus. Die Methode gibt einen Boolean zurück.
	private function executeStmt($query, $parameters)
	{
		$dbc = $this->Connection;
		
		$stmt = $dbc->prepare($query);

		foreach($parameters as $parameter)
		$stmt->bindParam($parameter->getParamName(),$parameter->getParamValue());
		
		if($stmt->execute())
		return true;
		else
		return false;
	}

	// Liefert ein result aus der Datenbank zur�ck.
	public function getResultWithQuery($query)
	{
		return getResult($query, $this->Connection);
	}

	public function getResultWithConnection($query, $dbc)
	{
		return getResult($query, $dbc, array());
	}

	public function getResultWithParameter($query, $dbc, $parameter)
	{
		if(is_array($parameter))
		getResultFromDB($query, $dbc, $parameter);
		else
		{
			$parameters = array();
			$parameters[] = $parameter;
			getResultFromDB($query, $dbc, $parameters);
		}
	}

	// Die Methode leifert entweder das Result zurück oder null falls der Datenbankzugriff nicht glückt.
	// Falls Sie mal eine Objekt aus der Datenbank auslesen müssen, also das result nur aus einem Wert besteht,
	// dann greifen Sie in ihrer Methode mit result[0][0] auf dieses Element zu.
	public function getResultFromDB($query, $dbc, $parameters)
	{
		if(!is_array($parameters))
		return null;

		$stmt = $dbc->prepare($query);

		if($parameters != null)
		foreach($parameters as $param)
		$stmt->bindParam($parameter->getParamName(),$parameter->getParamValue);

		if($stmt->execute())
		{
			$result = $stmt->fetchAll();

			if($result != null)
			return $result;
			else
			return null;
		}
		else
		return null;
	}

	// Die Methode gibt ein Objekt aus einem Result zurück.
	public function getObject($result, $fieldName)
	{
		if($result->fieldName)
		return $result->key;
	}

	// Speichert Daten in die Datenbank.
	public function saveToDB($tableName, $parameter)
	{
		if(is_array($parameters))
		saveDataToDB($tableName, $parameter, true);
		else
		{
			$parameters = array();
			$parameters[] = $parameter;
			saveDataToDB($tableName, $parameters, true);
		}
	}

	//Die Methode aktualisiert Werte in der Datenbank oder f�gt Werte ein. Sie gibt false oder true zur�ck.
	public function saveDataToDB($tableName, $parameters, $idParameter = NULL)
	{
		$query = null;
		$benutzteParameter = array();
		
		if($idParameter != NULL)
		{
			$query = "UPDATE $tableName SET ";
			
			foreach($parameters as $param)
			if(!empty($param))
			{
				$query .= str_replace(':', '', $param->getParamName())." = ".$param->getParamName().",";
				$benutzteParameter[] = $param;
			}
			else
			$query .= str_replace(':', '', $param->getParamName())." = NULL,";
			
			$query = trim($query, " ,\t\n\r\0\x0B");
			
			$query .= " WHERE ".str_replace(':', '', $idParameter->getParamName())." = ".$idParameter->getParamName().";";
			$benutzteParameter[] = $idParameter;
		}
		else
		{
			$names;
			$values;
			
			foreach($parameters as $param)
			if(!empty($param))
			{
				$names = str_replace(':', '', $param->getParamName()).",";
				$values = $param->getParamName().",";;
				$benutzteParameter[] = $param;
			}
			
			$query = "INSERT INTO $tableName (".trim($names, " ,\t\n\r\0\x0B").") VALUES (".trim($values, " ,\t\n\r\0\x0B").");";
		}
		
		if($this->executeStmt($query, $benutzteParameter))
		return true;
		else
		return false;
	}
}
?>
<?php

/********************************************************************************************************************
 *
 *                                        				DB
 *
 *                                       Copyright (C) 2009 Marcel Melzig
 *
 *          This program is free software; you can redistribute it and/or modify it under the terms of the
 *          GNU General Public License as published by the Free Software Foundation; either version 3 of
 *          the License, or (at your option) any later version.
 *
 *          This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 *          without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *          See the GNU General Public License for more details.
 *
 *          You should have received a copy of the GNU General Public License along with this program;
 *          if not, see http://www.gnu.org/licenses/.
 *
 *********************************************************************************************************************/

class SQLParameter
{
	// Properties
	private $paramName;
	private $paramValue;
	
	// Constructor
	public function __construct($Name, $Wert)
	{
		if(substr($Name, 0, 1) != ':')
		{
			$Name = ':'.$Name;
		}
		
		$this->paramName = $Name;
		$this->paramValue = $Wert;	
	}
	
	// Getter und Setter
	public function getParamName()
	{
		return $this->paramName;
	}
	
	public function setParamName($Name)
	{
		if(substr($Name, 0, 1) != ':')
		{
			$Name = ':'.$Name;
		}
		
		$this->paramName = $Name;
	}
	
	public function getParamValue()
	{
		return $this->paramValue;
	}
	
	public function setParamValue($Value)
	{
		$this->paramValue = $Value;
	}
}
?>
<?php
class ConnectionData
{
	const server = "localhost";
	const servertyp = "mysql";
	const user = "root";
	const password = "";
	const db = "hanswurst";
}
?>

Die Klasse DB bietet Methoden an mit der man Daten aus der Datenbank holen, speichern, updaten oder löschen kann. Die Klasse SQLParameter diffiniert einen Parameter der an das Statement gebunden wird. Ich rate dir auch mal dazu PDO zu nutzen. Einfach mal danach googlen. Das kann die Performance deiner Datenbankzugriffe erhöhen und schützt dich vor SQL-Injections.

Das Speichern von Daten sieht in meinem Programm dann so aus:

$parameters[] = new SQLParameter(':text', $this->text);
		
if($this->db->saveDataToDB('texte', $parameters, new SQLParameter(':name', 'bio')))
return true;
else
return false;

Sieht ja dann schon viel übersichtlicher aus. Im Grunde würden auch zwei Zeilen reichen, aber ich habe mir angewöhnt jeder Methode einen Rückgabewert zu verleihen. Entweder true oder false um den Erfolg der Methode in einer if()-Bedingung überprüfen zu können oder zumindest null bei einem Misserfolg.

Und es spricht nichts dagegen den Inhalt deiner Seiten in eine Datenbank zu schreiben. Das Parsen einer Textdatei ist wohl kaum schneller. Genau aus diesem Grund nimmt man ja eine Datenbank. Um seine Daten zu verwallten. Und weil deine HTML Seiten ja auch nur Text sind hält sich die Größe der String die du in die Datenbank schreibst in Grenzen. Was du nicht machen solltest ist Binärdaten in deine Datenbank zu schreiben. Zum Beispiel die Bilder deiner Galerie. Speicher die Bilder lieber als Datei und schreibe nur den Pfad in die Datenbank, da sowas wirklich langsam sein kann.

Für deine Galerie musst du natürlich dein Datenbankmodell erweitern. Du brauchst Tabellen, in der du Galerien mit Bildern und Vorschaubildern verknüpfst. Eventuell speicherst du noch zu jedem Bild einen Namen und eine Beschreibung ect.

Und du musst das Rad ja auch nicht bei allem neu erfinden.

Schau dir mal das an:

ckeditor.com/

Damit kannst du z.B. den Inhalt deiner Seiten erstellen.

Ich hoffe ich konnte dir ein wenig helfen. Tschö

um zu überprüfen welche rechte ein Benutzer hat, reicht immer eine Abfrage :ps:

es ist mit SQL kein Problem mehrere Tabellen und Spalten nach Einträgen abzusuchen :wink: