functions.database.php / dbUpdateSequence()

tono
Beiträge: 574
Registriert: Mo 25. Apr 2005, 20:51
Wohnort: Frankfurt am Main
Kontaktdaten:

functions.database.php / dbUpdateSequence()

Beitrag 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?
tono
Beiträge: 574
Registriert: Mo 25. Apr 2005, 20:51
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von tono »

Vorschlag:

Datei: functions.database.php
Zeile: 592

Code: Alles auswählen

db$->close();
ersetzen durch:

Code: Alles auswählen

unset(db$);
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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$ ??
*** make your own tools (wishlist :: thx)
tono
Beiträge: 574
Registriert: Mo 25. Apr 2005, 20:51
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag 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.
tono
Beiträge: 574
Registriert: Mo 25. Apr 2005, 20:51
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag 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? :(
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

Ist noch nicht verschoben, da ich es noch nicht reproduzieren konnte

ich verschiebs aber trotzdem gerne mal
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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
*** make your own tools (wishlist :: thx)
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag 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
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...
*** make your own tools (wishlist :: thx)
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag 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...
tono
Beiträge: 574
Registriert: Mo 25. Apr 2005, 20:51
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag 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?
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag 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...
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Gesperrt