Wenn ich das nun richtig erkenne arbeitest Du doch über mehrere Klassen verkapselt, oder?
Warum dann nicht in jeder Klasse einen __destruct() wo die jeweilige DB geschlossen wird?
Hi Leudde,
ich hab da ein OOP-Problem...wahrscheinlich nur ein Denkfehler den ich leier verfolgt habe.
Also, esgeht eigentlich nur darum, eine Liste von Clips ausgeben zu lassen die in einer Datenbanktabelle gespeichert sind. An jedem Clip hängt auch ein User, naja, und ich will halt alle Daten ausgegeben haben.
Des ganze wird per $ausgabe .= xxxxx als tabelle gespeichert und $ausgabe wird später an das Seitentemplate übergeben.
Naja, Theorie ganz einfach, wie man es mir sagte:
eine schleife über die gesamte Tabelle, ein Array mit dem Clipobjekt füllen, und das Clipobjekt holt sich dann aus der klasse User noch die Daten und aus der klasse kategorie. einfach solte man denken.
Datenbankverbindung stelle ich auf der testseite über nen Include her her ( new mysqli(****))
PHP-Code:class DBConn {
var $db;
{
function __construct ($_host="localhost",$_dbname="clipix",$_user="root",$_pass="") {
$this->db = new mysqli($_host,$_user,$_pass,$_dbname);
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
}
$dbConn = new DBConn();
Tempmovies:PHP-Code:$sql = "SELECT * FROM tempmovies ";
$res = $dbConn->db->query($sql);
while ($row = $res->fetch_object()) {
$TempMovies[] = new TempMovie($row->id);
}
$ausgabe .= "<h2>CLIPS IM PUFFER</h2>";
$ausgabe .= Ausgabe::movie_temp($TempMovies);
So, an der stelle wird ja nochma zur DB connectetPHP-Code:function __construct($_id='') {
$this->id = $_id;
$this->conn = new DBConn();
$this->conn->db->query("SET names 'utf8'");
if ($this->id!='') {
$this->get();
}
}
dann in der get-methode:
So, in der User dann folgendes:PHP-Code:$this->user = new User($row->user);
Wieder eine Verbindung zur DB.PHP-Code:function __construct($_id='') {
$this->id = $_id;
$this->conn = new DBConn();
$this->conn->db->query("SET names 'utf8'");
if ($this->id!='') {
$this->get();
}
}
Naja, und weiter unten greige ich dann ncohma auf new Kategorie zu, dort brauch ich ja auch ne DB-Verbindung
Also, das klappt auch alles soweit, aber ab einer bestimmten grösse der Tabelle habe ich "Too many Connections mysqli ... usw usw"
Leuchtet mir ja auch ein, weil ich ständig an die DB geht und der destructor ja erst aufgerufen wird, wenn die klasse abgearbeitet wurde am ende.
Aber ich brauch in den Klassen doch eine anbinung an die DB.... habs schon versucht die $dbconn mit zu übergeben an die onstructors...des geht dann auch alles, aber des kann net sinn der sache sein, oder ?
Natürlich Include ich die DB-Class nur einmal, also da is kein fehler wegen mehrfachem include oder so.
Wo ist da mein denkfehler ?
Ich hoffe ich konnte das Problem gut genug beschreiben, arbeite jetzt schon seit um 7 und bin net mehr so ganz frisch im kopf, nur dieses letzte Problem lässt mich einfach net los...ich möcht das einfach nciht alles umprogrammieren müssen![]()
Geändert von Schakal81 (22.03.2008 um 11:34 Uhr)
Wenn ich das nun richtig erkenne arbeitest Du doch über mehrere Klassen verkapselt, oder?
Warum dann nicht in jeder Klasse einen __destruct() wo die jeweilige DB geschlossen wird?
so wie ich das sehe machst Du auch noch für jedes erstellte Objekt eine eigene Connection auf. Das muss wirklich nicht sein, DB sollte über ein Singleton laufen.
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
7PHP-Code:function __destruct() {
unset($this->conn);
}
Ich denk ma du meinst des ^^
Ja des mach ich ja auch, allerdings denk ich ma das er wegen der schleife da ja so oft reingeht und echt so viele verbindungen aufbaut bevor er am destruktor angekommen is das ich "too many" hab
@ steffenk:
Das hört sich interesant an, da will ich ja eigentlich auch hin...eine Verbindung und die kann ich dann nutzen, daher ja die Idee mit dem durchschleifen von $dbconn, nur war mir klar das es das nets sein kann ^^
Ich hab jetzt pauschal zum beispiel
http://www.phppatterns.com/docs/desi...gleton_pattern
gefunden...aber wenn ich ehrlich bin werd ich da net schlau draus, 1. was es bringt, 2. wie es funktioniert und 3. wie ich des für meine dbverbindung nutzen kann, bzw wie ich sie dann aufrufe.
Kannst mir da evtl. weiterhelfen, ne andere gute seite wo des anhand von DB erklärt wird, oder nen kleines Beispiel
Hi,
über Sinn und Unsinn von Singletons lass ich mich jetzt hier nicht aus, aber im Prinzip funktioniert das so:
Und nutzen würdest du das so:PHP-Code:
class DBConn {
protected static $instance;
public $db;
public static function getInstance(){
if( self::$instance === null ){
self::$instance = new DBConn();
}
return self::$instance;
}
function __construct ($_host="localhost",$_dbname="amateure",$_user="root",$_pass="") {
$this->db = new mysqli($_host,$_user,$_pass,$_dbname);
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
}
}
Damit greifst du immer auf die selbe Instanz der Klasse zu. Noch besser wäre natürlich, wenn DBConn von MySQLi ableitet, dann könntest du den Wrapper vermeidenPHP-Code:$dbconn = DBConn::getInstance();
//.... weiterer Code
![]()
Wer sabotiert eigentlich ständig meine Signatur?
Vielen vilen Dank !!!
Klappt einwandfrei.
Ok,du hast mich allerdings auch neugierig gemacht mit "über Sinn und Unsinn von Singletons lass ich mich jetzt hier nicht aus". Das hört sich so an als ob es nicht grad die beste Möglichkeit ist.....![]()
Mit dem ableiten meinst du dann mysqli->DBConn****** ??
nein, so hat Manuelito das nicht gemeint. Fakt ist das PHP keine echten Singletons bereitstellt und man das über Umwege erreicht, wie Manuelito das gezeigt hat.
Mit ableiten meint er class DB extends MySQLi (grob gesagt)
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
aso, alles klar![]()
vielen dank nochma für eure hilfe !
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)