Website per PHP an MySQL - Grundkonzepte

M.E.

Lt. Commander
Registriert
Jan. 2007
Beiträge
1.923
Hallo,

Ich plane für die Zukunft meine Website durch eine MySQL Datenbank dynamischer zu machen.
PHP, MySQL, HTML und CSS beherrsche ich, brauche dazu also kein Tutorial.

Was ich aber suche ist ein Tutorial, das gängige Grundkonzepte eines solchen Aufbaus einer Website darlegt und gleich über mögliche Fehlerquellen informiert.

Habe natürlich schon etwas gegoogelt und einige insteressante Dinge gefunden, allerdings keine konkreten Beispiele.

Ich habe es mir so vorgestellt:
Eine Tabelle enthält alle Seiten.
Die Seiten werden über index.php aufgerufen (z.B. index.php?page=tutorial_blabla)
und dann per mod_rewrite Suchmaschinenfreundlich gemacht (z.B. /tutorial_blabla/)
Ist das sinnvoll? Wie gehe ich z.B. mit Bildern um?


Auf meinem lokalen XAMPP kann ich beliebig testen, würde aber natürlich gerne etwas systematischer an die Sache rangehen.

MfG
M.E.
 
Für Private Lernprojekte ist das interessant, aber du musst dir bei PHP auch Gedanken um die Sicherheit der Seite machen.

Wenn du wirklich nur eine bestehende Seite dynamischer machen willst, solltest du dir evtl lieber eine fertige Lösung (CMS) ansehen.

Wenn dir der Lernspaß am PHP, MySQL im Vordergrund liegt, dann kannst du das genau so machen, wie du oben beschrieben hast.

Bedenke halt, dass du die Seiten, wenn du diese per .php? direkt aus der Datenbank holen willst, mit SQL injektion zu kämpfen hast und das solltest du direkt von Anfang an in deinem Code bedenken und Gegenmaßnahmen einbauen.
 
Grundsätzlich kann ich hier nur triton beipflichten.
PHP und (My)SQL (MySQL ist die Frage, ob es in Zukunft noch benutzt wird, aber so viel anders sind andere Lösungen auch nicht) ist es sehr weites Feld.
Letztendlich kann man für den normalen Gebrauch eher davon abraten, es sei denn, man kennt sich schon mit Sicherheitskonzepten usw. aus. Aber dies alles auf die Schnelle so eben durch ein Tutorial zu lernen ist viel zu komplex.
Ansonsten ist http://www.selfphp.de/ ein guter Anfang, sich mit der Materie auseinander zu setzen.
 
Halle M.E.

ich bin selber webadministrator und webdesigner, und kann dir sagen das der aufwand für solch ein projekt nicht in der relation zu einem gerigem zeit aufwand besteht.
Es ist mit sicherheit auch ein gutes gefühl ein eigenes CMS am laufen zu haben als ein vorhandenes zu benutzen. ich selber habe ein kleines cms entwickelt, worauf du achten musst ist die usabillity, sicherheit (sowas wie direct accsess) und ein sauberer code. Leider gibt es, meines erachtens keine aussagekräftigen homepages wo auf gewisse aspekte eingegangen wird. hier musst du google benutzen und dir von allem etwas zusammenpacken.
Wichtig bei einem CMS ist unter anderem die kompatibilität zu anderen scripten wie jquery, speziellen php-applikationen und das du dein server (php, ftp, und myspl) vernünftig konfigurierst.

Allen in Allem würde ich dir trotzdem raten ein bereits vorhandenes CMS-System zu benutzen, hier gibt es bereits einige, mit sehr großen communitys. Das hate den vorteil das es ohne ende plugin und extensions gibt.

Ich arbeite unter anderem mit:
Typo3 (sehr flexible, da Templates und webseiten verhalten über typoscript steuerbar)
Joomla (sehr simple für menschen die nicht viel von Codes verstehen)
Drupal (für große und flexible Communitys)
 
Also ganz ehrlich... soviel "Vernunft" in einem Thema habe ich schon lange nicht mehr gelesen.
Da hat man endlich mal jemanden, der lernwillig ist, und Ihr ratet ihm vorgefertigte Lösungen zu verwenden.
Sry Jungs, sicher habt Ihr ansatzweise Recht, aber M.E. hier das Gefühl zu geben, die Programmierung von Dynamischen Websites wäre Zauberei finde ich ein wenig unfair.

Schonmal am Spaß an der Freude gedacht? Er lernt doch nix, wenn er es nicht selber probiert. Und so lange es nur um private Dinge geht, ist doch alles okay!

Ich würde an deiner Stelle erstmal Informationen zusammentragen, welche Fehler du überhaupt begehen kannst. Denke beim Coden auch immer einen Schritt weiter, ob das, was du geschrieben hast auch wirklich nur so Funktioniert oder es sich evtl. auch anders Ausnutzen lässt. Das macht wirklich Spaß und ist super Interessant! Das hat mir Google ausgespuckt, sieht auf den ersten Blick sehr interessant aus. Eine SQL-Injection zu verhindern bzw. sicheren Code zu schreiben ist mitnichten so schwer, wie dir hier einige Glauben lassen wollen.

Was meinst du mit "Wie gehe ich z.B. mit Bildern um?" Wie du die abspeicherst, entgegen nimmst oder überprüfst?

Sollte jetzt nicht patzig rüber kommen Leute... aber versteht ihr was ich meine?
 
Die genannten CMS kann ich bis auf Drupal nicht empfehlen, aber das ist wieder ein anderes Thema, und hier geht es nicht darum.
Wenn Sicherheit im Internet wirklich so einfach ist frage ich mich, wieso alle größeren und kleineren CMS massive Probleme damit haben, wo hunderte, wenn nicht tausende Leute den Quellcode ansehen. Ganz so einfach geht das alles nicht.
Die Seite cms-sicherheit.de ist ganz gut - aber da muss man erst einmal überhaupt die ganzen Konzepte kennen. Es macht wenig Sinn sich Seiten über PHP-sicherheit durchzulesen wenn man das Grundkonzept nicht kennt.
Letztendlich finde ich lernt man besser, wenn man sich ein fertiges System ansieht, und dieses evtl. erst einmal um sich an die Programmierung zu gewöhnen durch Module usw. erweitert.
Alleine schon die Frage "wie man mit Bildern umgeht" ist ein recht komplexes Thema, je nach Webspace (PHP/FTP-User) auch sehr komplex.
Natürlich ist es etwas anderes, wenn man schon Erfahrungen in PHP / SQL o.ä. hat.
 
Jo... bin zwar jetzt auch kein Superprofi... aber bei SQL_Injection muss man halt einfach
aufpassen, daß in einem SQL String nix landen kann, was da nicht reingehört.

Beispiel 1:
========

"SELECT * FROM datenbank WHERE $user_id = $id"

mit $id als Variable.

Könnte man von aussen über die URL oder über 'ne Form Einfluss auf die $id haben, könnte man natürlich
eingeben "1; DELETE FROM datenbank;"

Gäbe dann zusammen "SELECT * FROM datenbank WHERE $user_id = 1; DELETE FROM datenbank;" als SQL String.

Böse.

=> Vor der SQL Ausführung checken ob in $id wirklich eine Zahl steckt (is_numeric).



Beispiel 2:
========


Nicht weniger böse:

SELECT * FROM datenbank WHERE user_name = '$user_name';


Da könnte man über ein Formfeld bsplsweise einfügen: '; DELETE FROM datenbank WHERE 1 or username = '

Gäbe zusammen dann: SELECT * FROM datenbank WHERE user_name = ''; DELETE FROM datenbank WHERE 1 or username = '';

=> Alle Daten futsch, weil WHERE 1 immer true ist.

Abhilfe hier: mysqli_real_escape bzw. mysqli_real_escape

Die gefährlichen Anführungszeichen bekommen dann ein Escapezeichen vorgestellt (\') und werden
damit unschädlich gemacht.



Einfach bissl mitdenken, beim SQL String bauen, dann klappt das schon. :)
 
Hallo,
Das da etwas mehr Arbeit und Zeit dahinter steckt hatte ich erwartet.
Aber ich plane es ja auch für die Zukunft und möchte jetzt nur eben ein bisschen darin einsteigen, um dann später bescheid zu wissen.

Das Sicherheit ein so großes Problem darstellt war mir nicht ganz bewusst.
http://www.cms-sicherheit.de/ werde ich mir dazu mal durchlesen.
@Katzenjoghurt Danke für das Beispiel, das klärt das Problem sehr gut!

"Wie man mit Bildern umgeht":
Ich meine damit, wie man Bilder am besten verwaltet, also wo man sie abpeichert wenn man eine extra Tabelle für sie anlegt, oder ob man einfach eine solide Ordnerstruktur beim Speichern verwendet.

Tenschert schrieb:
(MySQL ist die Frage, ob es in Zukunft noch benutzt wird, aber so viel anders sind andere Lösungen auch nicht)
Was meinst du mit in Zukunft noch benutzt wird? Was wäre denn eine Alternative?
http://www.torsten-horn.de/techdocs/db-web.htm
Da sind so gut wie alle Möglichkeiten gelistet und ich bin der Meinung PHP+MySQL ist das beste für mich. Da kann ich natürlich falsch liegen?

Von einem fertigem CMS zu lernen halte ich persönlich für sehr umständlich, da die meisten verfügbaren CMS schon derart komplex sind, dass man sich nicht mal eben ein wenig in z.B. den PHP Code einlesen kann. Aber ich kann mir ja mal ein paar Konzepte ansehen.

Danke für die vielen Antworten!

MfG
M.E.
 
So vom Gefühl her mein ich, daß Microsoft langsam aus seinem Winterschlaf aufwacht
und asp mehr und mehr interessanter wird.

Dazu noch die Möglichkeit mit Silverlight echt schicke RIA Anwendungen zu entwickeln,
die anders als in Flash wieder ganz klassisch in WebdesignCode (XAML) und Funktionalität (z.B. C#)
unterteilt sind, so wie man's bisher mit HTML und Javascript kennt.

Microsofts großer Vorteil ist halt, mit Visual Studio 'ne echt geile Entwicklungsumgebung zu bieten,
wo dann auch alles sich schön ineinander verzahnt.

PHP/MySQL/Flash... is halt so 'ne Combo, wo man irgendwie mit x Tools nebeneinander herschafft,
was imo auf die Produktivität schlägt.


Aber: Hab da nur kurz reingeschnuppert, weil ich in dem Bereich mein Diplom machen wollte.
Bin aber nun doch in der Computergrafik gelandet. :)
Drum alles bissl mit Vorsicht zu genießen.

PHP/MySQL wirkte halt auf mich im Nachhinein einfach bissl retro, wenn man mal kurz mit Visual
Studio rumgespielt hat.
 
@ M.E.

Deine Idee mit einer index zu arbeiten und per $_GET die jeweiligen Seiten aufzurufen, ist mit Sicherheit nicht verkehrt. Der nächste Schritt sollte auf jeden Fall sein, die $_GET['site'] zu filtern und z.B. nur Kleinbuchstaben und ein Unterzeichen zuzulassen (jenachdem wie das Linkmuster aussehen soll). Im Falle dass der User versucht, über die URL etwas zu manipulieren, werden einfach alle unzulässigen Zeichen bspw. durch "" ersetzt. Somit hast du auf keinen Fall Probleme mit URL Injections.

Generell sollte $_GET und $_POST in jeder Situation gefiltert und validiert werden, am Besten nach einem Whitelist Schema.
 
Katzenjoghurt schrieb:
PHP/MySQL/Flash... is halt so 'ne Combo, wo man irgendwie mit x Tools nebeneinander herschafft,
was imo auf die Produktivität schlägt.
Exakt ;)

Mit ASP habe ich auch mal gearbeitet allerdings mit Basic. Das war grauenhaft und ist mir deshalb im negativer Erinnerung geblieben.
Allerdings war das auf Arbeit mit einem Microsoft Server.
Mein Webserver ist aber ein Apache und soweit ich weiß müsste er ASP extra unterstützen...?

Das Problem mit Silverlight ist, dass man es auch als Client benötigt und ich möchte, dass jeder ohne irgendeine Software installieren zu müssen meine Seite besuchen kann.

Gibt es irgendwie nen direkten Vergleich
ASP vs. PHP+MySQL
Wenn man so googelt stößt man meißt auf kindische Vergleiche und viel Wiedersprüchliches...

Die Sicherheitsprobleme bei PHP+MySQL scheinen sich ja relativ gut in den Griff bekommen zu lassen, bei ASP weiß ich nich, was es da für Probleme gibt, ich habe nur lokal damit gearbeitet.
Ich denke ich werde zunächst mal bei PHP+MySQL bleiben.

@Trainmaster
Danke, das hilft mir schonmal ein bisschen für den Ansatz.

MfG
M.E.
 
Ich meine fast, das es mehr eine Sache der persönlichen Vorliebe ist, ob man ASP oder PHP verwendet. Letzteres hat mit Eclipse eine ebenfalls solide Entwicklungsumgebung die dazu noch kostenlos ist.

Musste Arbeitstechnisch ein halbes Jahr lang ASP.net mit C# programmieren. Finde es nicht schlecht, auch VS macht nen guten Eindruck. Letztentlich halte ich es aber viele Anwendungsbereiche einfacher, mit PHP zu arbeiten, was sicherlich an der Gewöhnung liegen muss... ^^
Wie gesagt, gibt alles vor und nachteile.

Ich meine damit, wie man Bilder am besten verwaltet, also wo man sie abpeichert wenn man eine extra Tabelle für sie anlegt, oder ob man einfach eine solide Ordnerstruktur beim Speichern verwendet.

Überlege dir genau, für welchen Einsatzzweck du später dein CMS verwendest, welche Anzahl von Bildern du erwartest und wie viele Besucher du bei deiner Seite erwartest.
Ich musste das damals auch auf die harte Tour lernen, als meine Seite mit ~200 Besuchern/Tag innerhalb kurzer Zeit auf 5000 anstieg. Damals landeten alle Bilder in einem (!) Verzeichnis... tu das blos nicht! ;)
Wenn du ein Webdir mit >20000 Bilddaten hast, wirds sehr schnell, sehr langsam. Überlege dir eine sinnvolle Ordnungerstruktur welche z.B. über ID's , Timestamp's oder Kategorien läuft.

Auch ganz wichtig: Halte die Anzahl an SQL-Querys möglichst niedrig. Bei mehreren 100000 Aufrufen pro Tag kann das deinen Server ruck-zuck in die Knie zwingen.

Und zu guter letzt... beende jede Connection zu deiner Datenbank! Hört sich blöd an, ist allerdings auch ein häufig gemachter Fehler welcher bei vielen Zugriffen den mySQL-Server unnötig belastet.

Imo kannst du Bilder auch direkt in eine MYSQL-Tabelle abspeichern. Ist allerdings umständlich und bläht die Datenbank unnötig auf.
 
Wenn es dir um einen Lerneffekt geht und du in in Zukunft vielleicht professioneller Entwickeln willst, könntest du mit einem template engine arbeiten
 
@sfranz

Die gängigen Varianten sind über $_GET und $_POST. Generell alle Eingaben, die vom Benutzer getätigt werden können. Anderes ist mir jedenfalls nicht bekannt.


@Gruml

Professionelle Entwicklung hat nicht zwangsläufig etwas mit der Benutzung von Template Engines zu tun. Und weil du gerade den Lerneffekt ansprichst, hat es meiner Ansicht nach umso weniger, wenn man einfach bestehende Klassen verwendet. Außerdem bietet bereits PHP selbst die Möglichkeit, PHP und HTML weitestgehend zu trennen. Ein Lerneffekt wäre es, wenn man evtl. eine eigene Engine Klasse entwickelt.
 
Trainmaster schrieb:
Außerdem bietet bereits PHP selbst die Möglichkeit, PHP und HTML weitestgehend zu trennen. Ein Lerneffekt wäre es, wenn man evtl. eine eigene Engine Klasse entwickelt.

Wie das?

Für mich ist das ein fürchterliches Kuddelmuddel aus...

echo "<a href ..." . " ... $php_variable .... >";

etc.


Oder hab ich da was grundlegendes bisher immer übersehen?

(Ehrlicherweise mich aber auch noch nie mit dem ModelViewController
Ansatz des Zend Frameworks beschäftigt, der so eine Trennung ja
verspricht... aber auch da muss die View ja dynamisch sein)
 
Du übersiehst mit deinem Beispiel etwas grundlegendes.

Selbst mit Smarty lagerst du nicht einzelne <a> Elemente in eine Template-Datei aus, das wäre wohl zu viel des guten. Nimm ein System, das z.B. Smarty verwendet, unter die Lupe. Dort wirst du überall im Code kleinere Fragmente von HTML finden, wie z.b. <input><a><img> etc.

Eine Möglichkeit, die ich relativ gut und übersichtlich finde, ist mit Objekten zu arbeiten. Das kann so aussehen:

PHP:
<html>
<body>
<div class="menu_oben"><?php Menu::getInstance()->holeMenu('oben');?></div>
<div class="inhalt"><?php Menu::getInstance()->holeInhalt('startseite');?></div>
<div class="inhalt"><?php Menu::getInstance()->holeMenu('unten');?></div>
</body>
</html>

Das ganze kann man natürlich belieblig tief und noch detaillierter gestalten, ganz seinen Wünschen. Sieht zwar nicht ganz so schön aus wie geschweifte Klammern bei Smarty, aber im Endeffekt ist es nicht anderes. Man könnte natürlich einen eigenen Parser für geschweifte Klammern schreiben. Nichts ist unmöglich ;)
 
Trainmaster schrieb:
@Gruml
Professionelle Entwicklung hat nicht zwangsläufig etwas mit der Benutzung von Template Engines zu tun. [..] Ein Lerneffekt wäre es, wenn man evtl. eine eigene Engine Klasse entwickelt.

Das ist richtig. Doch dazu muss einem das Konzept eines Engines/Model View Controller Patterns/und/und/und erst einmal bekannt sein.
 
Trainmaster schrieb:
Du übersiehst mit deinem Beispiel etwas grundlegendes.

Selbst mit Smarty lagerst du nicht einzelne <a> Elemente in eine Template-Datei aus, das wäre wohl zu viel des guten. Nimm ein System, das z.B. Smarty verwendet, unter die Lupe. Dort wirst du überall im Code kleinere Fragmente von HTML finden, wie z.b. <input><a><img> etc.

Eine Möglichkeit, die ich relativ gut und übersichtlich finde, ist mit Objekten zu arbeiten. Das kann so aussehen:

PHP:
<html>
<body>
<div class="menu_oben"><?php Menu::getInstance()->holeMenu('oben');?></div>
<div class="inhalt"><?php Menu::getInstance()->holeInhalt('startseite');?></div>
<div class="inhalt"><?php Menu::getInstance()->holeMenu('unten');?></div>
</body>
</html>

Das ganze kann man natürlich belieblig tief und noch detaillierter gestalten, ganz seinen Wünschen. Sieht zwar nicht ganz so schön aus wie geschweifte Klammern bei Smarty, aber im Endeffekt ist es nicht anderes. Man könnte natürlich einen eigenen Parser für geschweifte Klammern schreiben. Nichts ist unmöglich ;)

Das spannende ist doch aber dabei, was hinter holeMenu() steckt, was die saubere Trennung von HTML und PHP angeht.
Die wiederum wär ja v.a. deshalb sexy, damit Webdesigner die Repräsentation programmieren können in html (ohne sich mit php rumzuschlagen) und php'ler sich um Datenbankzugriffe und dynamische Komponenten kümmern.
 
Zurück
Oben