Hallo.
Ja, aber nun hast du 50 Beiträge lang zumindest Wissen/Erfahrung gesammelt. :-) Fehler und Irrwege sind ganz natürlich im Lernprozess. Man muss ja auch erfahren, warum man bestimmte Wege besser nicht geht.
Ja da hast du Recht..
Das "Beste" gibt es nicht. Aufwand und Nutzen ist immer gegeneinander abzuwägen. Nutzt es etwas, eine Instanz zu haben, wenn die Methoden alle unabhängig voneinander arbeiten? Ist es weniger aufwendig, diese Methoden sttisch aufzurufen? Wenn ich mich recht erinnere schrieb ich schon im ersten Faden, dass eine Klasse mit reinweg statischen öffentlichen Methoden eine Alternative ist.
Ja richtig und als dann alle wie wild mit Singleton Pattern um sich warfen hatte ich mich dafür entschieden.
»» So das halt wirklich die Datenbank verbindung _nur_ bei einem Query kurzzeitig aufgebaut wird.
»» Wie baue ich Sie danach wieder ab?
»» mit $_Connection->close() ?Ich würde sie einfach stehen lassen. Ein Abbauen bedeutet ein erneutes Aufbauen-Müssen bei der nächsten Query im selben Script. Die Verbindung allein frisst kaum Brot. Sie belegt nur einen Platz der max connections. Wenn du eine hochbelastete Anwendung mit mehr als 100 gleichzeitig laufenden Scripts erstellst oder sie sich so entwickelt, wirst du noch ganz andere Optimierungen finden müssen.
Aber ich speicher sie doch lokal für den _einen_ Query ab, beim nächsten Query holt er sich doch eh eine neue Verbindung aufgrund _getConnection().
Oder sollte ich einfach überprüfen - ist eine DB-Verbindung vorhanden? wenn nicht, erstelle eine und speicher sie Klassenglobal als private static $db_connection und beim nächsten mal nehme die alte abgespeicherte Verbindung?
Hier meine aktuelle Klasse:
class db{
# Instanz - Singleton Pattern
private static $_instance;
# Verbindungsdaten
private static $_db_host;
private static $_db_user;
private static $_db_pw;
private static $_db_name;
private static $_count_array;
private static $_rwu_sentence;
public static $query;
public static $result;
const select = 1;
const update = 2;
const delete = 3;
const insert = 4;
# Konstruktor - private - kann nicht aufgerufen werden
private function __construct(){}
# 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
private static function db_connect(){
$_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 {
return true;
}
return $_db_connection;
}
######################################################################################################
################# db_make_rwu_sentence
######################################################################################################
// Ein-/Auslesewerte aneinanderreihen
/*
3 Typen:
Typ 1: foo,bar
Typ 2: 'foo','bar'
Typ 3: foo='bar',foo='bar',
Typ 4: ?,?,? - MySQLi Platzhalter für prepared Statements
*/
private static function db_make_rwu_sentence($what_rwu,$what_insert,$rwu){
$x=0; // Zähler auf NULL(0) setzen
self::$_rwu_sentence=''; // Zurücksetzen des Ausdrucks
foreach($what_rwu as $what){
if($rwu==1||$rwu==2){ // Typ 1 oder 2
self::$_rwu_sentence .= ($rwu==1) ? $what : "'".$what."'";
} elseif($rwu==3) { // Typ 3
self::$_rwu_sentence .= $what."='".mysqli_real_escape_string($what_insert[$x])."'";
} elseif($rwu==4) { // Typ 4
self::$_rwu_sentence .= "?";
}
self::$_rwu_sentence .= ($x < self::$_count_array - 1) ? "," : "";
++$x; // hochzählen
}
return self::$_rwu_sentence;
}
######################################################################################################
################# db_create_normal_query
######################################################################################################
// Erstellt einen Query
/*
$what_array -> Spaltennamen
$what_insert -> Was reingeschrieben wird
$from_table -> welche Tabelle angesprochen wird
$when -> BEDINGUNG! Wann macht der Querie etwas? Wo? -> $WHEN....
$whatkind -> Was für ein RUDI Query ist es? (SELECT(3), UPDATE(2), DELETE(4), INSERT(1))
*/
public static function db_create_normal_query($what_array,$what_insert, $from_table, $when, $whatkind){
// RUDI-Queries
# Wieviele Werte sind ein-/auszulesen
self::$_count_array=count($what_array);
if ($whatkind==self::select) { // SELECT ((R)ead)
self::$query="SELECT ".self::db_make_rwu_sentence($what_array,'',1)." FROM ".$from_table." WHERE ".$when;
} elseif ($whatkind==self::update) { // UPDATE ((U)pdate)
tools::check_array_numbers($what_array,$what_insert);
self::$query="UPDATE ".$from_table." SET ";
self::$query.=self::db_make_rwu_sentence($what_array,$what_insert,3);
self::$query.=" WHERE ".$when;
} elseif ($whatkind==self::delete) { // DELETE ((D)elete)
self::$query="DELETE FROM ".$from_table." WHERE ".$when;
} elseif ($whatkind==self::insert) { // INSERT ((I)nsert)
if(!tools::check_array_numbers($what_array,$what_insert)) self::db_errors("Die Arrays sind nicht gleichlang!");
self::$query="INSERT INTO ".$from_table." (".self::db_make_rwu_sentence($what_array,'',1);
self::$query.=") VALUES (".self::db_make_rwu_sentence($what_insert,'',2).")";
} else { // Kein Typ -> Error
self::db_errors("Es wurde kein Typ ausgewählt");
}
self::db_query(self::$query);
}
/**
* Query abarbeiten
*
* @param string $sql ein SQL-Statement
* @param mixed $asObject false: Fetchen als Array
* true: Fetchen als Objekt
* string: Name der zu instantiierenden Klasse
* @param array $objectParams optionale Parameter @see mysqli_result::fetch_object()
* @return array Ergebnismenge als Array mit Arrays oder Objekten
*/
# Query ausführen
public static function db_query($sql, $asObject = false, $objectParams = null) {
$result = array();
$mysqli = self::db_connect();
# $mysqli = $this->_getConnection(); // das ist eine private Methode, die mit ein mysqli-Objekt mit aktiver Verbindung gibt.
$mysqliResult = $mysqli->query($sql, MYSQLI_USE_RESULT);
if (!$mysqliResult)
throw new Exception(...);
if ($mysqliResult instanceof mysqli_result) {
try {
if ($asObject) { // true oder string
if (is_string($asObject)) {
if (!class_exists($asObject))
throw new Exception('class ' . $asObject . ' does not exist.');
} else { // kein Klassenname übergeben, Standard-Klasse verwenden lassen
$asObject = null;
$objectParams = null;
}
while ($row = $mysqliResult->fetch_object($asObject, $objectParams))
$result[] = $row;
} else
while ($row = $mysqliResult->fetch_assoc())
$result[] = $row;
} finally {
// wird unbedingt benötigt, wegen MYSQLI_USE_RESULT @see mysqli::query()
$mysqliResult->free();
}
}
return $result;
}
# Clone - unterbinden
public function __clone() {
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
Bei deinem Skript kommen allerdings zwei Fehler aufgrund:
throw new Exception(...);
Was kommt statt "..." hin?
Und er erwartet "catch": Parse error: parse error, expecting `T_CATCH' in
Sprich hier : } finally {
Wäre nett wenn du die zwei Fehler und sonstige die du in der Funktion siehst noch beheben könntest :-[
Mit try, exceptions usw muss ich mich eh noch auseinandersetzen, werde ich in der zwischenzeit mal tun.
Danke dir,
lg, Chris