Static-Variablen und mysql_connections, Singleton
Tom
- php
0 1UnitedPower0 Tom
0 Mitleser0 hotti0 Mitleser- menschelei
0 Tom
Hello,
ist es nicht möglich, MySQL-Connection-Objekte in PHP-Static-Variablen zu speichern?
Die Idee war:
function get_db_con($connect = true)
{
static $con;
if ($connect and !$con)
{
$con = mysqli_connect(DB_HOST, DB_MASTER, DB_MASTERPW, DB_DATABASE);
}
elseif (!$connect and $con)
{
if (mysqli_close($con)) $con = false;
}
else
{
$con = false;
}
# die('get_db_con: '.(!$con?'no connection':'connected')); ## bis hier funktionierts
return $con;
}
Wenn ich die Funktion dann später im selben Script wieder aufrufe, ist die Connection leider wieder weg...
Mit Arrays und anderen Typen klappt dieses Singleton aber prima...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Meine Herren!
Wenn ich die Funktion dann später im selben Script wieder aufrufe, ist die Connection leider wieder weg...
Ist sie das wirklich? var_dump( $con )?
Ich könnte mir vorstellen, da kommt int(0) raus. Und int(0) ist falsy.
Hello,
Wenn ich die Funktion dann später im selben Script wieder aufrufe, ist die Connection leider wieder weg...
Ist sie das wirklich? var_dump( $con )?
Ich könnte mir vorstellen, da kommt int(0) raus. Und int(0) ist falsy.
Ja?
Ich stehe jetzt leider auf dem Schlauch.
Hier scheint PHP wieder eine seiner berühmten Inkonsostenzen zu haben...
Wenn ich mit GLOBAL arbeite, hat es bisher funktioniert, aber GLOBAL mag ich nicht.
Allerdings müsste ich das für diesen Spezialfall auch sicherheitshalber nochmal überprüfen. Macht leider nur einige Dutzend Änderungen im Script notwendig...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Meine Herren!
Wenn ich die Funktion dann später im selben Script wieder aufrufe, ist die Connection leider wieder weg...
Ist sie das wirklich? var_dump( $con )?
Ich könnte mir vorstellen, da kommt int(0) raus. Und int(0) ist falsy.Ja?
Das war pure Vermutung, dürfte aber schnell getestet sein.
Meine Herren!
Ist sie das wirklich? var_dump( $con )?
Ich könnte mir vorstellen, da kommt int(0) raus. Und int(0) ist falsy.Ja?
Das war pure Vermutung, dürfte aber schnell getestet sein.
Ne das ist Unfug. mysqli_connect liefert keinen Integer, sondern eine mysqli-Instanz zurück. Und Objekte sind in PHP truthy. Da habe ich ne falsche Fährte gelegt.
Hello,
Und Objekte sind in PHP truthy. Da habe ich ne falsche Fährte gelegt.
Das Blöde ist ja, dass die einzelnen Teile zuvor beim Test in der Top-Down-Schreibweise (mit partiellen Auskommentierungen) funktioniert haben.
Nachdem ich die einzelnen Sektionen nun in Funktionen verpackt habe, streikt das Konstrukt.
Aber ich hatte heute schon mal so einen blöden Fehler, an dem ich über vier Stunden gebrütet habe. Unter Windows lief es anfangs, unter Linux nicht. Dann habe ich den Code verschlimmbessert, da war es anschließend umgekehrt. Bis ich dann den falsch hinzugefügten '/' entdeckt hatte, der unter Linux tolerant ignoriert wurde, aber bei Windows zu "/S:/home..." geführt hat, waren die Stunden dahin...
Vermutlich habe ich hier ja nur genauso einen dummen Denkfehler drin.
*OhOhOh*
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Vermutlich habe ich hier ja nur genauso einen dummen Denkfehler drin.
function get_db_con($connect = true)
{
static $con;if ($connect and !$con)
{
$con = mysqli_connect(DB_HOST, DB_MASTER, DB_MASTERPW, DB_DATABASE);
}
elseif (!$connect and $con)
{
if (mysqli_close($con)) $con = false;
}
else
{
$con = false;
}# die('get_db_con: '.(!$con?'no connection':'connected')); ## bis hier funktionierts
return $con;
}
>
>
> Wenn ich die Funktion dann später im selben Script wieder aufrufe, ist die Connection leider wieder weg...
Isch hab keine Ahnung von PHP, aber: in welchem der drei Zweige landest Du wohl beim zweiten Aufruf von "get\_db\_con()"?
> Mit Arrays und anderen Typen klappt dieses Singleton aber prima...
Aber dann isses doch keins, weil $con nur im lokalen Scope der Funkiton lebt und jedes Mal eine neue Verbindung aufgebaut wird.
Meine Herren!
Mit Arrays und anderen Typen klappt dieses Singleton aber prima...
Aber dann isses doch keins, weil $con nur im lokalen Scope der Funkiton lebt und jedes Mal eine neue Verbindung aufgebaut wird.
Ne, mit dem Schlüsselwort static teilt man PHP mit, dass alle Funktionsaufrufe sich die selbe Variable teilen soll.
Hello,
Ne, mit dem Schlüsselwort static teilt man PHP mit, dass alle Funktionsaufrufe sich die selbe Variable teilen soll.
Klar! Das ist ja die Idee: Jedes Mal beim AUfruf der Funktion lebt die Variable wieder auf, natürlich nur innerhalb derselben Script-Instanz. Man kann dann mit dem letzten Stand der Variablen weiterarbeiten.
Alle anderen Variablen - mit Ausnahme von GLOBALs - verlieren ihre Werte und verschwinden im Nirwana.
static-Variablen schlummern aber im Hintergrund, bis die Funktion wieder aufgerufen wird, sind damit also "dynamische Konstanten", keiner kommt ran, außer der Funktion, in der sie deklariert wurden :-)
Oder habe ich das jetzt verkehrt verstanden?
Aber vermutlich liegt der Fehler auch wieder ganz woanders :-((((
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Ne, mit dem Schlüsselwort static teilt man PHP mit, dass alle Funktionsaufrufe sich die selbe Variable teilen soll.
Jo, aber der logische Fehler in Toms Code führt in Kombination mit static eben dazu, dass seine Funktion sich nicht wie das gewünschte Pseudo-Singleton verhielt. Erst durch die Wegnahme von static tat es das. Logisch, weil die Variable damit lokal wurde und bei jedem Funktionsaufruf eine neue Verbindung aufgebaut wurde.
Hello,
Isch hab keine Ahnung von PHP, aber: in welchem der drei Zweige landest Du wohl beim zweiten Aufruf von "get_db_con()"?
OhOhOh.
Du hast natürlich Recht - danke!
Das war an dieser Stelle der Fehler.
Da fehlte die wichtigste Auswahlmöglichkeit "$connect and $con" ...
die steht jetzt als erste drin.
Nun muss ich nur noch die übrigen Verschlimmbesserungen im gesamten Script noch finden. ;-O
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Nun muss ich nur noch die übrigen Verschlimmbesserungen im gesamten Script noch finden. ;-O
Ist dir bewusst, dass Singletons fast immer falsch gebraucht werden und das Pattern daher oftmals schon als Antipattern gilt?
Siehe auch:
http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Nachteile
und wie man es besser machen kann:
http://googletesting.blogspot.de/2008/05/tott-using-dependancy-injection-to.html
hi Tom,
verrate mir mal, warum Du über einen Scriptverlauf die DB-Sitzung ein- und aussschalten willst.
Horst
Hello,
verrate mir mal, warum Du über einen Scriptverlauf die DB-Sitzung ein- und aussschalten willst.
z. B. weil ich zwischendurch auch mal eine andere Datenbankverbindung nutzen will?
Gründe könnte man dafür sicherlich viele finden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
verrate mir mal, warum Du über einen Scriptverlauf die DB-Sitzung ein- und aussschalten willst.
Gründe könnte man dafür sicherlich viele finden.
Eher weniger, jeder neue Connect ist mit einem gewissen Overhead verbunden ;)
Also, es frisst Zeit, eine Sitzung herzustellen.
Hotti
Nach all dem jahrelangem Rumgesabbel über den Sinn und Unsinn von OOP, Design-Patterns und was auch immer hat mich dieser Thread final in meiner Einschätzung bestätigt. Vielen Dank dafür!
Ich werde deine (und Hottis natürlich!) weiterhin mit Spannung lesen. Soweit genug Popcorn am Start ist.
Hello,
Ich werde deine (und Hottis natürlich!) weiterhin mit Spannung lesen. Soweit genug Popcorn am Start ist.
Danke.
Das hat die Frage jetzt ausführlich beantwortet :-D
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg