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, 16:45

4. Die Datenbank & Einstellungen

Erst einmal ein kleines Update: Nennt bitte mal den Ordner "Content/Seiten" in "Content/pages" um, sowie den Ordner "admin/seiten" in "admin/pages". Nochmals Danke für den Tipp an Erik!

Wenn ihr noch keine Datenbank erstellt habt, dann mcht das jetzt bitte.
Ich habe die Datenbank einfach "CMS" genannt.

So, nun zu den CMS-Einstellungen.
Zuerst legen wir mal eine neue MYSQL-Tabelle an:

MySQL-Abfrage(n)

1
2
3
4
5
CREATE  TABLE  `cms`.`cms_settings` ( `property` VARCHAR( 255  )  NOT  NULL ,
 `value` VARCHAR( 255  )  NOT  NULL ,
 `activated` INT( 4  )  NOT  NULL DEFAULT  '1',
 `is_editable` INT( 4  )  NOT  NULL DEFAULT  '1',
 PRIMARY  KEY (  `property`  ) ) ENGINE  =  MYISAM ;


Wie das geht, solltet ihr wissen, ansonsten lest euch mal mein anderes Tutorial durch: SQL Wie erstelle ich eine MYSQL-Tabelle?.

So, erst mal noch etwas zur Datenbank (Danke an erik für den Tipp!):

Im Ordner "CMS" legen nun einen neuen Ordner an: "databases".
In diesen Ordner kommt jetzt die Datei "db.php" aus dem Ordner "CMS/classes", allerdings wird sie in "MySqlDatabase.php" umbenannt.
In dem Ordner "CMS/classes" legen wir aber eine neue Datei an, die "db.php" heißt.
In diese Datei kommt eine Klasse, die genau so heißt.
Die Klasse MySqlDatabase erbt dann von dieser Klasse.

db.php:

PHP-Quelltext

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

abstract class Database {

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

public abstract function verbinden();

}

?>


Nun zur Datei "MySqlDatabase.php" im Ordner "CMS/databases".
Sie sieht jetzt so aus:

PHP-Quelltext

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

class MySqlDatabase extends Database {

public function verbinden () {

    $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.");

}

}

?>


"extends Database" bedeutet, das diese Klasse von der Klasse Database erbt, also ihre Methoden und Variablen übernimmt.

Und jetzt müssen wir noch die index.php aktualisieren, sie sieht jetzt so aus:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
<?php

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");

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

?>


Im Dateianhang habt ihr wieder den aktuellen Stand.
»JuKu« hat folgende Datei angehängt:
  • Stand_4.zip (2,06 kB - 170 mal heruntergeladen - zuletzt: 09.12.2018, 10:27)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »JuKu« (07.10.2011, 16:52)


JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

2

06.10.2011, 17:45

@Erik, Simon, ...:
Und gefällt euch die Klasse so? ;)
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

3

06.10.2011, 17:51

`activated` INT( 11 ) NOT NULL DEFAULT '1', `is_editable` INT( 11 ) NOT NULL DEFAULT '1',

Wofür brauchen diese Keys 11 Zahlen?
Meinst du nicht, dass das etwas viele sind?

Und ansonsten: Meine Kritik an der Db-Klasse steht im anderen Thema ;)

Und ich würde, wenn du schon alles Englisch machst, auch die Methoden englisch benennen.
Sprich: connect($host, $username, $password); anstatt verbinden(); ;)

tom

Schüler

Beiträge: 54

Registrierungsdatum: 20.06.2011

Danksagungen: 18

  • Private Nachricht senden

4

06.10.2011, 17:59

Und ansonsten: Meine Kritik an der Db-Klasse steht im anderen Thema ;)
dito.

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

5

06.10.2011, 18:05

`activated` INT( 11 ) NOT NULL DEFAULT '1', `is_editable` INT( 11 ) NOT NULL DEFAULT '1',

Wofür brauchen diese Keys 11 Zahlen?
Meinst du nicht, dass das etwas viele sind?

Und ansonsten: Meine Kritik an der Db-Klasse steht im anderen Thema ;)

Und ich würde, wenn du schon alles Englisch machst, auch die Methoden englisch benennen.
Sprich: connect($host, $username, $password); anstatt verbinden(); ;)
Ok, Danke für den Tipp!
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

6

06.10.2011, 19:03

Meinst du nicht, dass auch 4 zuviel ist?
Ich meine, 1ne Zahl reicht doch.

Das sind 10 Zustände. (0-9)
Für active kann ich mir nur 2 vorstellen 0 und 1.
Für editable das selbe.

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

7

06.10.2011, 19:33

@Simon:
Bezieht sich der Wert in den Klammern den wirklich auf die Zeichenlänge der Zahl und nicht eher auf die Anzahl der Bytes oder Bits. Ich meine weil ein Wertebereich von 0-9 währe z.B. unmöglisch. Wennd das in SQL wirklich so gehanthabt wird, würde mich das irgendwie verwundern. Ich arbeite eigendlich immer nach dieser Tabelle:
http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html
Die mach meiner Meinung auch mehr Sinn und ich habe auch nie gewusst was die Zahl in der Klammer heißt, weshalb ich auch eher diese Methode nutze :D
Signatur ?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

8

06.10.2011, 19:43

Okay, ich hatte mich vertan.
Der Wert in den Klammern hat nichts mit der Anzahl der Zeichen zutun..
Mit der Bytezahl jedoch auch nicht.

Ich würde einfach den TINTYINT nutzen. Der reicht locker mit -128 - 128

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

9

06.10.2011, 19:47

Und dann wüde ich ihn auch ohne Vorzeichen machen. Also einfach aus prinzieb :D, weil brauchen tut man die Wert ebis 255 auch nicht. Oder was ich am schönsten findn würde, da es ja glaube ich "Wahrheitswerte" sein sollen: 'BOOLEAN' oder 'BOOL'
Signatur ?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

10

06.10.2011, 19:49

Einen Bool gibt es soweit ich weiß nicht in MySQL.

PhpMyAdmin hat den zwar, aber das wird soweit ich weiß nur vorgetäuscht. Es macht daraus dann einen TinyInt ;)

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

11

06.10.2011, 19:52

In der Seite von mySQL habe ich gelesen das BOOL und BOOLEAN eine Synonyme für TINYINT ist, Also es ist das selbe, aber nicht von PHPMyAdmin zur verfügung gestellt sondern von MySQL. Und ich finde es eindeutiger :D
Signatur ?

tom

Schüler

Beiträge: 54

Registrierungsdatum: 20.06.2011

Danksagungen: 18

  • Private Nachricht senden

12

06.10.2011, 19:53

ein TINYINT unter MySQL benötigt ausserdem nicht mehr Speicher als ein bool unter beispielsweise C++ :)

Deshalb würde ein eigener DATENTYP für BOOL keinen Sinn machen.

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

13

06.10.2011, 19:56

Esseiden man würde sie Schlau aufbauen und Bit für bit und byte für byte füllen :P aber das wäre übertrieben :D

Edit: Wir kommen Off-Topic :D

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

14

06.10.2011, 20:01

Zitat von »http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html«

BOOL, BOOLEAN
These types are synonyms for TINYINT(1). A value of zero is considered false. Nonzero values are considered true


Also sie werden von MySQL zur verfügung gestellt :D
Ja, aber dann ist wenigstends klar was man sucht. Es geht ihr nur um den Programmierstil, nicht um den nutzen.

Und nebenbei: In C++ gibt es die möglichkeit mehrere Boolen-Variablen so zusammen zu fügen das man nur für alle maximal 8 nur einen Byte braucht. So kann man in PHP auch 2 INT-Werte mit je 4 Bits zu einem Byte zu erstellen. Allerdings ist das ein winig übertrieben und meist nicht nötig, da es nur ein ein paar einzelen Bytes spart :D
Signatur ?

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

15

06.10.2011, 20:21

Das habe ich ja angedeutet ;)

Und BOOL ist nichts anderes als TINYINT(1), das steht auch später so in der Tabelle, also man sieht keinen Unterschied ;)

Und ich denke, dass Thema kann man jetzt beruhen lassen ;)

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

16

06.10.2011, 21:19

Schöner wäre trotzdeme BOOL, weil es einfach logischer ist :)

Naja und zur Klasse, die Zugangsdaten sollen immer noch nicht hardcode sein, aber glaube das kommt noch...
Soll jetzt jedes Datenbankobjekt nur eine Datenbank benutzen, oder mehrere auf einem Host? Eine würde eigentlich reichen... Aber du musst natürlich die Zugangsdaten sowie die Datenbank im Konstruktor übergeben... Ggf. vielleicht noch getter und setter (?)

Wenn jedes Datenbankobjekt eine Verbindeung zu nur einer Datenbankverbindung repräsentiert, dann könntest du eine Klasse haben, zB. DatabaseManager. Diese Hätte dann als Member ein Array von Objekten der abstrakten Klasse Database. (Je nachdem wie dynamisch das ist vielleicht auch nen Vector statt Array, kp...) Die DatabaseManager Klasse könnte vielleicht statisch sein, kp ob das Sinn macht... Über Diese Klasse hättest du jedenfalls Zugriff auf alle Datenbankdaten, egal ob du jetzt mehrere Datenbanken hast oder soagr mehrere Server...

Naja wie immer nur sone Idee, hab immer noch kp von MVC...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Es hat sich bereits 1 registrierter Benutzer bedankt.

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

Johannes S. (06.10.2011)

Patrick

Profi

Beiträge: 694

Danksagungen: 168

  • Private Nachricht senden

17

07.10.2011, 14:46

War es nicht zufälligerweise Ich und nicht Erik, der dir das mit pages gesagt hat? ;)

Ich würde vlt. die Ordner nicht seiten nennen, sondern, pages, das ist englisch – so wie der Rest – so kann es jeder verstehen. :)
Ex ungue leonem.

War der Beitrag für dich hilfreich?
Dann drück auf .

Es hat sich bereits 1 registrierter Benutzer bedankt.

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

JuKu (07.10.2011)

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

18

07.10.2011, 15:13

Jup :D
Hab den andern Post mal gelöscht :)
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

19

07.10.2011, 16:57

Schöner wäre trotzdeme BOOL, weil es einfach logischer ist :)

Naja und zur Klasse, die Zugangsdaten sollen immer noch nicht hardcode sein, aber glaube das kommt noch...
Soll jetzt jedes Datenbankobjekt nur eine Datenbank benutzen, oder mehrere auf einem Host? Eine würde eigentlich reichen... Aber du musst natürlich die Zugangsdaten sowie die Datenbank im Konstruktor übergeben... Ggf. vielleicht noch getter und setter (?)

Wenn jedes Datenbankobjekt eine Verbindeung zu nur einer Datenbankverbindung repräsentiert, dann könntest du eine Klasse haben, zB. DatabaseManager. Diese Hätte dann als Member ein Array von Objekten der abstrakten Klasse Database. (Je nachdem wie dynamisch das ist vielleicht auch nen Vector statt Array, kp...) Die DatabaseManager Klasse könnte vielleicht statisch sein, kp ob das Sinn macht... Über Diese Klasse hättest du jedenfalls Zugriff auf alle Datenbankdaten, egal ob du jetzt mehrere Datenbanken hast oder soagr mehrere Server...

Naja wie immer nur sone Idee, hab immer noch kp von MVC...
Eine Datenbank reicht.
Es wird ja auch nur ein Datenbank-Object erstellt, das in der Variable $db ist.
In dieser Variable ist also z.B. ENTWEDER MySqlDatabase oder ein anderer Datenbank-Treiber.
Das ganze wird dann aber von einem Datenbank-Manager verwaltet, der dann das richtige Objekt erstellt. :D
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

20

07.10.2011, 17:12

Und wenn man mehrere Datenbanken hat?
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Ähnliche Themen