Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: DeveloperTalk. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

1

06.10.2011, 18:03

5. CMS-Einstellungen auslesen

Nun geht es darum, die CMS-Einstellungen auszulesen.
Wir haben ja schon eine MYSQL-Tabelle "cms_settings" erstellt, jetzt kommen wir zu dem Teil, die Einstellungen auszulesen.
Dazu erstellen wir eine neue Klasse Settings.
Diese hat erst einmal 2 Methoden:
  • getSetting($property) zum auslesen einer Einstellung
  • setSetting($property, $value) zum "setzen" einer Einstellung
Hier ist der Code der "settings.php" im Ordner "CMS/classes":

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

class Settings {

        public static function getSetting($property) {

                global $db;
                return $db->getSetting($property);

        }

        public static function setSetting($property$value) {

                global $db;
                $db->setSetting($property$value);

        }

}

?>


Wieso ich dafür eine neue Klasse erstellt habe und nicht einfach die Methoden in der Klasse Database bzw. MySqlDatabase aufgerufen habe, werdet ihr später erfahren, das hängt mit dem Cache zusammen.

Als nächstes werden wir die Datei "CMS/classes/db.php" editieren.
Sie sieht nun so aus:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

abstract class Database {

            protected $host "localhost";//Host
            protected $benutzer "root";//Benutzername
            protected $passwort "Justin96";
            protected $datenbank "CMS";
            public $db_link;

            public abstract function connect();

            public abstract function getSetting($property);
            public abstract function setSetting($property$value);

}

?>


Nun zur Datei "MySqlDatabase.php" im Ordner "CMS/databases":

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

class MySqlDatabase extends Database {

            public function connect () {

                            $this->db_link mysql_connect($this->host$this->benutzer$this->passwort) or die("Anfrage fehlgeschlagen.");

                            mysql_select_db($this->datenbank) or die("Die datenbank konnte nicht ausgew&auml;hlt werden.");

            }

            public function getSetting($property) {

                            $sql "SELECT * FROM `cms_settings` WHERE `property` = '" mysql_real_escape_string(trim($property)) . "'; ";
                            $db_erg mysql_query($sql) or die("Anfrage fehlgeschlagen.");

                            $zeile mysql_fetch_array($db_ergMYSQL_ASSOC);

                            if (isset($zeile['value'])) {
                                        return $zeile['value'];
                            } else {
                                        return false;
                            }

         }

            public function setSetting($property$value) {

                    $property mysql_real_escape_string(trim($property));
                    $value mysql_real_escape_string(trim($value));
                    $sql "UPDATE `cms_setting` SET `value` = '" $value "' WHERE                         `property`='".mysql_real_escape_string(trim($property))."';";
                    $db_erg mysql_query($sql) or die("Anfrage fehlgeschlagen.");

        }

}

?>


Nun wollen wir das ganze auch testen und legen deßwegen mal eine Einstellung an:

MySQL-Abfrage(n)

1
2
3
4
5
INSERT  INTO  `cms`.`cms_settings` ( `property` ,
 `value` ,
 `activated` ,
 `is_editable` )
VALUES ( 'selectedskin',  'default',  '1',  '1');


Diese werden wir später eh brauchen.

Um das ganze nun zu testen, bearbeiten wir die index.php, sie sieht jetzt so aus:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

error_reporting(E_ALL);

require("CMS/classes/db.php");//Hinweis: Ihr könnt die Klammern auch weglassen, nähere Infos gibt es bei Simon^^ (http://www.developertalk.de/user/2-simon/)
require("CMS/databases/MySqlDatabase.php");

require("CMS/classes/settings.php");

$db = new MySqlDatabase();
$db->connect();

echo Settings::getSetting("selectedskin");//Zum testen, danach bitte diese zeile entfernen

?>

Wenn ihr alles richtig gemacht habt, müsste jetzt "default" ausgegeben werden.;)
Ihr findet wie immer im Dateianhang den aktuellen Stand.
»JuKu« hat folgende Datei angehängt:
  • Stand_5.zip (2,69 kB - 253 mal heruntergeladen - zuletzt: 09.12.2018, 10:27)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »JuKu« (07.10.2011, 17:01)


JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

2

06.10.2011, 18:58

Der beitrag ist jetzt fertig.
Kritik bitte! ;)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

niklas319

Schüler

Beiträge: 103

Registrierungsdatum: 07.08.2011

Wohnort: Rheinland-Pfalz

Danksagungen: 10

  • Private Nachricht senden

3

06.10.2011, 19:03

PHP-Quelltext

1
 $sql "SELECT * FROM `cms_settings`


Selecte nur die Zeile value, den Rest brauchst du nicht, spart Rechenleistung ;)

PHP-Quelltext

1
 $sql "UPDATE `cms_setting` SET `value` = '" $value "' WHERE


Hier nicht die Bediengung für Where vergessen?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

4

06.10.2011, 19:11

Also:
Du hast da was leicht falsch verstanden. Eine Datenbank Klasse stellt Zugriff auf die Datenbank bereit.
Sprich:

abstract class Database
{
abstract public function query($sql);
abstract public function connect($host, $user, $password);
abstract public function escape($sequence);
}

Um mal ein kleines Beispiel zu geben.

Nun die Settings.
Wieso sollte das in der Datenbankklasse stehen?
Die beiden haben nichts mit einander zutun, außer dass Setting Database benutzen muss.

Also gehört der Code zum Settings auslesen nicht in die Databaseklasse, sondern in die Settingsklasse.

global $db;

Das würde ich nicht machen.
Ich würde die Datenbankinstanz an die Settingsklasse übergeben.
Das ist total schlecht in Punkte Wiederverwendbarkeit und Anpassbarkeit ;)

Edit: Die where-clause ist mit Tabs versteckt ;) Würde ich abändern :D
Ansonsten "SELECT `value` FROM `cms_setting` WHERE ... LIMIT 1;" <- damit nur ein Eintrag gesucht wird, ist performanter ;)

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

5

06.10.2011, 19:40

@Simon:
Wenn die erste Spalte ('property') ein Schlüssel ist (vor allem wenn es der Primärschlüssel ist) dürfte es Leistungsmäßig kaum einen Unterschied machen ob du LIMIT 1 hast oder nicht.
Signatur ?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

6

06.10.2011, 19:41

Das mit dem Primary hatte ich übersehen. Schaden tut es jedoch trotzdem nicht, dann sieht man wenigstens, dass nur ein Ergebnis zurück kommt ;)

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

7

06.10.2011, 21:31

Doch man hat mehr Traffic zum MySQL Server, weil der QueryString länger ist :P

Wie Simon gesagt hat, gat das mit der Datenbank nichts zutun. Ich würde die Klasse Properties nennen. Und die Funktion-/Parameternamen sind auch verwirrend.

Zitat


getSetting($property)
setSetting($property, $value)


Ich würde daraus machen:
getProperty($key)
setPropertie($key, $value)

Und eins hast du noch vergessen, was passiert, wenn es den Key garnicht gibt? Du könntest zum Beispiel die Möglichkeit bieten, getProperty einen Standartwert zu übergeben, der zurückkommt, falls ncihts gefunden wurde (finde ich sehr nützlich), oder du wirfst eine Exception (z.B. PropertyNotFound oder so, analog zu FileNotFound). Oder, du überlädst getProperty, dadurch könntest du sogar beide Möglichkeiten anbieten...

EDIT: Die Ordnerstruktur ist immer noch crap. Alle Klassen sollten in einem Ordner sein (in deinem Fall classes) !!
Außerdem musst du die Files so benennen, wie die Klassen, also nciht db.php sondern Database.php. Das ist dafür gut, wie schon jemand gesagt hat, dass du den Autoloader benutzen kannst. (Das solltest du auch möglichst bald mal einführen :) )
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

8

07.10.2011, 17:15

Also:
Du hast da was leicht falsch verstanden. Eine Datenbank Klasse stellt Zugriff auf die Datenbank bereit.
Sprich:

abstract class Database
{
abstract public function query($sql);
abstract public function connect($host, $user, $password);
abstract public function escape($sequence);
}

Um mal ein kleines Beispiel zu geben.

Nun die Settings.
Wieso sollte das in der Datenbankklasse stehen?
Die beiden haben nichts mit einander zutun, außer dass Setting Database benutzen muss.

Also gehört der Code zum Settings auslesen nicht in die Databaseklasse, sondern in die Settingsklasse.

global $db;

Das würde ich nicht machen.
Ich würde die Datenbankinstanz an die Settingsklasse übergeben.
Das ist total schlecht in Punkte Wiederverwendbarkeit und Anpassbarkeit ;)

Edit: Die where-clause ist mit Tabs versteckt ;) Würde ich abändern :D
Ansonsten "SELECT `value` FROM `cms_setting` WHERE ... LIMIT 1;" <- damit nur ein Eintrag gesucht wird, ist performanter ;)

Aber das Problem ist, das der Befehl mysql_fetch_array(), mysql_real-escape_string(), ... doch auch variiert.
Und die Sprache doch eig. auch, oder?
@Das ist total schlecht in Punkte Wiederverwendbarkeit und Anpassbarkeit ;):
Wieso? Wenn sie public ist, kann jede Methode darauf zugreifen.
Das Problem ist höchstens, das auch z.B. jedes Plugin diese Variable ändern kann. :S
Am besten, ich mache noch eine getter-Methode und $db private.
Aber sie gehört ja noch keiner Klasse an... :S
Naja, dann werde ich wahrscheinlich mal die Klasse erstellen. ;)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

9

07.10.2011, 17:18

Natürlich sind die unterschiedlich, das ist ja der Grund, warum die Klasse Database diese implementiert ;)
Wo ist da das Problem?

Und die Sprache ist nicht anders, es sollte immer SQL funktionieren...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

JuKu (07.10.2011)

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

10

07.10.2011, 17:23

Natürlich sind die unterschiedlich, das ist ja der Grund, warum die Klasse Database diese implementiert ;)
Wo ist da das Problem?

Und die Sprache ist nicht anders, es sollte immer SQL funktionieren...

Danke! Also ist der SQL-Syntax immer gleich.
Das wusste ich nicht.

@EDIT: Die Ordnerstruktur ist immer noch crap. Alle Klassen sollten in einem Ordner sein (in deinem Fall classes) !!
Außerdem musst du die Files so benennen, wie die Klassen, also nciht db.php sondern Database.php. Das ist dafür gut, wie schon jemand gesagt hat, dass du den Autoloader benutzen kannst. (Das solltest du auch möglichst bald mal einführen :) )

Nein, denn es sollen nicht alle Klassen im Ordner "CMS/classes" geladen werden.
Warum, werdet ihr später erfahren.
Und auch aus diesem Grund dürfen die SQL-Klassen auch nicht in diesem Ordner rein.
Man würde so ja alle vorhanden Datenbank-Treiber laden, statt einer, das ist meiner meinung nach unsinnig.
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

11

07.10.2011, 17:28

Nein, es werden nur Klassen geladen, die auch instanziiert werden. Dadurch hast du keinen Overhead... Aber wenn du alle Klassen irgendwo verstreust, keine Ahnung... willst du Hardcode im Autoloader?!
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

12

07.10.2011, 17:31

Danke! Also ist der SQL-Syntax immer gleich.


Nein Der Syntax ist nicht immer gleich.
Es gibt fast immer irgendwelche kleinen aber feinen Unterschiede ;)

@Das ist total schlecht in Punkte Wiederverwendbarkeit und Anpassbarkeit ;):

Das ist schlecht, weil man, wenn man Klasse X, dass eine Datenbank braucht, nur verwenden kann, wenn die Variable $db nicht belegt ist.

Wenn dies aber belegt ist, scheitert es.

Weiteres Problem: 2 verschiedene Datenbanken für eine Klasse: Scheitert auch, außer man ändert $db immer hin und her, was nicht gerade schön ist.

Weiteres, bereits genanntes Problem: Jede Klasse kann die Variable löschen und ändern.

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

13

07.10.2011, 17:37

@Das ist schlecht, weil man, wenn man Klasse X, dass eine Datenbank braucht, nur verwenden kann, wenn die Variable $db nicht belegt ist.:
?( Die Variable $db beinhaltet die Instanz der Datenbank-Klasse, z.B. MySqlDatabase.
Also ruft man die Methoden über diese Variable auf, z.B. $db->query($sql).
Wo ist da das Problem?
@Problem 2:
Wird wie gesagt mit der DatenbankManager-Klasse behoben.
Oder kannst du mir mal sagen, was du genau meinst?
Mal eine andere Frage: Hat überhaupt schon jemand mal das "nachgemacht" und probiert? :D
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

14

07.10.2011, 18:45

Was ich meine ist, dass die Variable $db in dem Projekt bereits andersweitig in Benutzung sein kann.

In diesem Fall müsste man im ganzen Code das $db ändern, damit die Klasse benutzt werden kann.
Verstehst du, was ich meine? :D

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

15

07.10.2011, 19:18

Jetzt ja. :D
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Ähnliche Themen