Seite 1 von 2
functions.database.php / dbUpdateSequence()
Verfasst: Sa 5. Nov 2005, 22:25
von tono
Ich habe gerade versucht emergence Plugin-Installer hello_world_v4.zip von
http://dayside.net/files/index.php?path ... -examples/ auf eine 4.6.2 zu installieren. So wie ich das verstanden habe sollte das ja eigentlich gehen. Ich erhalte aber einen Fehler nach der Eingabe von Benutzername und Passwort:
Code: Alles auswählen
Fatal error: Call to undefined function: close() in /Library/WebServer/Documents/contenido_basti/contenido/includes/functions.database.php on line 592
Das ist auch nicht weiter verwunderlich, den in Zeile 592 wird die nirgens definierte Funktion $db->close() aufgerufen.
Ich denke wir haben es mit einem Bug zu tun, der sich bei der Umstellung auf tolerante Umgehensweise mit fehlendem $db-Parameter eingeschlichen hat. siehe
http://contenido.org/forum/viewtopic.php?t=9697
Kann das jemand reproduzieren/bestätigen?
Verfasst: Sa 5. Nov 2005, 22:33
von tono
Vorschlag:
Datei: functions.database.php
Zeile: 592
ersetzen durch:
Verfasst: Sa 5. Nov 2005, 22:38
von emergence
siehe
->
http://contenido.org/forum/viewtopic.php?p=59028#59028
das entstand aufgrund eines fehlers der in der mysqli extension aufgetreten ist...
ist im selben thread beschrieben...
aber es ist ne gute frage ob ein
unset($db)
ebenfalls die datenbank verbindung komplett aufhebt...
db$ ??
Verfasst: Sa 5. Nov 2005, 23:12
von tono
Warscheinlich nicht, da php ja keine Destruktoren unterstützt, und auch in db_mysql.inc keiner definiert wird. Braucht man denn diesen ->close()? Denn die functions.database.php ist die einzige Datei in der er aufgerufen wird. Sicher, eleganter ist es seine Databankverbindungen wieder ordentlich zu schließen, aber das hat Contenido bis jetzt nie getan.
OK, jetzt hab ich kurz unter dem Link zum PHP-Bugreport nachgelesen, und sage jetzt:
Wenn wir ->close() aufrufen, müssen wir auch dafür sorgen, dass es exsistiert und zwar in der Datei local.php in /conlib ab Zeile 95 (Ende der Classe DB_Contenido) einfügen:
Code: Alles auswählen
function close ()
{
if(is_callable(array('DB_Sql','close')))
{
parent::close();
}
else
{
parent::free();
}
}
Wenn die Methode close() exsistiert erben wir sie einfach, wenn sie nicht exsistiert implementieren wir free() in der Gewissheit, dass MySql Datenbankverbindungen sich selbst ordentlich beenden.
Verfasst: Mo 7. Nov 2005, 23:20
von tono
Ich bin immer noch der Meinung dass es sich hier um einen Bug handelt. Wird der gefixed, oder irre ich mich, und es ist gar keiner? Warum werden meine banalen Anmerkungen zur Doku nach Bugs verschoben, und die wirklichen Fehler bleiben unter Misc stehen?

Verfasst: Mo 7. Nov 2005, 23:47
von timo
Ist noch nicht verschoben, da ich es noch nicht reproduzieren konnte
ich verschiebs aber trotzdem gerne mal
Verfasst: Di 8. Nov 2005, 10:32
von emergence
tono hat geschrieben:Ich bin immer noch der Meinung dass es sich hier um einen Bug handelt. Wird der gefixed, oder irre ich mich, und es ist gar keiner?
es ist schon ein bug nur bin ich noch nicht mit dem testen fertig...
an sich sollte es niemals notwendig sein innerhalb einer funktion $db->close() aufrufen zu müssen...
mit dem fehlverhalten hab ich nämlich ein massives problem...
eingebaut wurde es als die mysqli extension standard war...
ich hab jetzt mal am wochende versucht das ohne phplib zu reproduzieren... und da ging es ohne probleme... das fehlverhalten das kein connect zustande kam, trat nicht mehr auf...
das heisst der fehler ist wo anders zu suchen...
entweder in der phplib oder es ist ein bug in der mysqli version...
das mit close ist ein workaround der mir einfach nicht gefallen will...
meiner meinung nach sollte die methode close aus der mysqli.inc entfernt werden und ebenso der aufruf von $db->close in der functions.database.php
Verfasst: Sa 19. Nov 2005, 14:45
von Oldperl
emergence hat geschrieben:
meiner meinung nach sollte die methode close aus der mysqli.inc entfernt werden und ebenso der aufruf von $db->close in der functions.database.php
Ich kann emergence da nur zustimmen, zumal in meiner offline-Install das gleiche passierte beim Einbinden mit dem Plugin-Installer, und bei mir die Fehlermeldung kam die Funktion close() existiere garnicht. Eigentlich logisch, da sie in der bei mir eingebundenen db_mysql.inc wirklich nicht vorhanden ist.
Ich hab nun einfach mal die Zeile in der dbUpdateSequence in functions.database.php auskommentiert.
Die andere Möglichkeit ist bei Aufruf der Funktion als 3. Parameter ein DB-Object mit zu übergeben, dann wird $db->close() nicht aufgerufen.
Gruß aus Franken
Ortwin
Verfasst: Sa 19. Nov 2005, 17:05
von emergence
im cvs wurde das jetzt so gelöst, das dennoch eine methode close in db_mysl.inc hinzugefügt wurde...
bin dennoch der meinung das es vorläufig doch komplett raus sollte...
Verfasst: Sa 19. Nov 2005, 17:26
von timo
wenn es eine andere Lösung für das MySQLi-Close-Problem gibt, nehme ich sie gerne, aber vorerst würd ich das close mal drinlassen...
Verfasst: Sa 19. Nov 2005, 21:33
von tono
Ich würde mich Timo da anschließen, was mich nur wundert: Ist das die einzige Stelle in Contenido an der dieses close() benötigt wird? Wenn es in Verbindung mit MySQLi zu Problemen kommen kann, da sollte das doch auch an anderen Stellen passieren, oder?
Verfasst: So 20. Nov 2005, 10:18
von emergence
ähm ja leider,
das ist die einzige stelle wo das (zumindestens bei mir) benötigt wird...
vielleicht kannst du es ja reproduzieren...
->
http://contenido.org/forum/viewtopic.php?p=58663#58663
ich find leider nicht die zeit, den grund genauer festzustellen...
Verfasst: Mo 23. Jan 2006, 10:23
von emergence
ich hab endlich ne lösung gefunden die auch mit mysqli ohne dem close funktioniert...
der trick an der sache ist einfach innerhalb der einzelnen functions.database.php eine $db_upgrade global zu setzen...
eigentlich genau so wie es mal in den älteren versionen von contenido mal der fall war..
eine übergabe des $db parameters innerhalb jedes funktions aufrufs ist somit nicht nötig...
sieht dann zu beginn jeder funktion in etwa so aus
Code: Alles auswählen
function dbUpdateSequence($sequencetable, $table)
{
global $cfg;
global $db_upgrade;
if (!is_object($db_upgrade)) {
$db_upgrade = new DB_Upgrade;
}
...
man könnte auch etwas wie das hier machen
Code: Alles auswählen
function dbUpdateSequence($sequencetable, $table, $db_upgrade = false)
{
global $cfg;
if (!is_object($db_upgrade)) {
global $db_upgrade;
$db_upgrade = new DB_Upgrade;
}
...
und die close methode ist nicht mehr notwendig...
Verfasst: Di 13. Jun 2006, 12:06
von emergence
hmm...
in der zwischenzeit kenne ich da auch den grund für die fehlermeldung...
es ist schlicht gesagt ein php bug der bei 5.0.4 windows reproduzierbar ist...
es werden einfach nicht alle db connections geschlossen...
die änderung oben sollten aber dennoch eingebaut werden...
Verfasst: Di 13. Jun 2006, 13:08
von HerrB
Gut, werde ich mal nachfragen. Läuft das dann nicht u.U. in das gleiche Problem wie hier:
http://www.contenido.org/forum/viewtopic.php?t=10226?
Dieses Problem trat bei mir sogar in der WAMP auf...
Gruß
HerrB