Okay, danke für die ganzen Beiträge, ich habe mir jeden durchgelesen.
Da prallt soviel Fachwissen gegeneinander das ich nicht mehr durchblicke.
Meine Klasse funktioniert jetzt:
class db{
protected static $_instance;
protected static $_db_host;
protected static $_db_user;
protected static $_db_pw;
protected static $_db_name;
protected static $_db_connection;
# Konstruktor - private - kann nicht aufgerufen werden
private function __construct(){}
# Singleton
public static function db_singleton()
{
if (!isset(self::$_instance)) {
self::$_instance = new db();
}
return self::$_instance;
}
# Datenbankwerte setzen
public static function db_set_vars($host,$name,$pw,$dbname){
self::$_db_host=$host;
self::$_db_user=$name;
self::$_db_pw=$pw;
self::$_db_name=$dbname;
}
# Zur Datenbank verbinden
public static function db_connect()
{
self::$_db_connection = new MySQLi(self::$_db_host, self::$_db_user, self::$_db_pw, self::$_db_name);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
} else {
echo "alles korrekt";
}
}
# Query ausführen
public static function db_query($query){
self::$_db_connection->query($query);
}
# Clone - unterbinden
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
$db=db::db_singleton();
$db->db_set_vars('localhost','root','philz','allethemen');
$db->db_connect();
$sql="INSERT INTO users(user,pw) VALUES('name','pw')";
$db->db_query($sql);
So..
Mir gefallen aber einige Dinge nicht und es tun sich noch einige Fragen auf:
1.
Man betrachtet:
$db=db::db_singleton();
$db->db_set_vars('localhost','root','philz','allethemen');
$db->db_connect();
Das ist mir zu umständlich, ich hätte viel lieber das wenn ich das Singleton erstelle, die Klasse die Zugangsdaten schon hat _und_ den Connect vornimmt.
Aus
$db=db::db_singleton();
$db->db_set_vars('localhost','root','philz','allethemen');
$db->db_connect();
soll
$db=db::db_singleton();
werden und es soll das gleiche passieren.
2. Das Singleton. Erstelle ich es einmal am Anfang von index.php oder macht das jede Klasse die es benötigt, was dann lazy? wäre?
3. Wie könnte die Vorabübergabe der Daten stattfinden.
Generell werden _alle_ Settings-Daten in einer settings.php stehen.
Sprich bei einem Serverumzug, Domainwechsel usw müsste eh einfach nur alles in der "Settings.php" geändert werden.
4. Dedlfix und Tom ihr errinnert dich denk ich. Ich habe noch eine Tools Klasse und eine Ext.Database Klasse mit Zusatzfunktionen.
Die Tools Klasse wird static, ich werde sie in fast jeder zweiten Klasse brauchen.
4.1 _Was_ kommt noch in die db-Klasse rein?
4.2 wie würdet ihr mit den beiden anderen Klassen verfahren?
5. Die Frage des Destruktors sehe ich in all den Beiträgen immernoch nicht geklärt.
Destruktor Ja/Nein?, warum?, rufe ich ihn auf?, wann?, ruft er sich selber auf?
6. Wie betreibe ich in dem Fall am besten die Fehlerbehandlung?
Meine Ideen wären:
1. Die Fehler in eine TXT zu schreiben
2. Es gibt 2 Modis. a. Entwicklung, b. WWWW.
Alle Fehler werden an eine extra Fehlerbehandlungsklasse weitergegeben, dort wird eine Variable aus der settings.php abgefragt über den aktuellen Status (a oder b).
a. Alles befindet sich in Entwicklung und auf meinem lokalen Webserver, es werden alle Fehler angezeigt und dick unterstrichen angegeben.
b. Es wird die Verbindung zur DB überprüft. Ist sie vorhanden, werden die Fehler dort eingetragen. Ist sie nicht vorhanden, wird versucht sie dort nochmal aufzubauen ohne die DB-Klasse. Geht das nicht, werden die Fehler in eine TXT geschrieben oder per E-Mail an mich geschickt.
Das wars erstmal.
Danke euch.
Lg, Chris