Thread DBI::db disconnect invalidates statement handle (10 answers)
Opened by iche at 2012-04-26 16:31

Gast iche
 2012-04-26 16:31
#157864 #157864
Hallo!

Und noch eine Frage:

Ich finde in meinen Errorlogfiles des Webservers diesen Eintrag.

---schnipp---
DBI::db=HASH(0x200b570)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at ...
---schnipp---

Weil mich das in den Wahnsinn treibt, habe ich versucht herauszubekommen, woran das liegen könnte.

Ich logge sämtliche Datenbankaufrufe mit und sehe folgendes:

Öffnen des $db-Handlers:
DBI::db=HASH(0x200b4f8)

Abfrage, die über diesen Handler läuft:
DBI::db=HASH(0x200b4f8) => SELECT row FROM table

Schliessen des Handlers:
DBI::db=HASH(0x200b4f8)

Der eigentlich Code sieht so aus und liefert genau eine Zeile im Ergebnis zurück:
Code (perl): (dl )
1
2
3
4
5
6
&mysql_connect($db)
my $sqlStatement = "SELECT row FROM ... ";
my $dbh = $db->prepare($sqlStatement);
$dbh->execute();
my $row = $dbh->fetchrow_array();
&mysql_disconnect($db)


Kommentiere ich den Codeblock aus, erscheint der kein Eintrag im Errorlogfile des Servers.

Hänge ich in obigen Code an vorletzer Stelle noch ein
Code (perl): (dl )
$dbh->finish;


rein, erscheinen auch keine Einträge im Logfile.

Deshalb gehe ich davon aus, das obiger Code den Fehler erzeugt.

Ich verstehe jetzt zwei Sachen nicht an der Sache.

1.) in der Subroutine "&mysql_disconnect" findet das hier noch statt
Code (perl): (dl )
if ($dbh) {$dbh -> finish;}

Damit sollte mein obiges "finish" eigentlich überflüssig sein

2.) ist das Verwirrendste. Im Errorlog erscheint ein anderer Hashwert. Nämlich "0x200b570" statt "0x200b4f8".
Das deutet eigentlich auf einen weiteren $db-Handler hin. Ich finde aber nichts, wo ich diesen erzeuge. Mir ist das völlig unklar.

Habt ihr einen Tipp?

Danke

modedit Editiert von GwenDragon: Titel gekürzt
Last edited: 2012-04-26 17:15:26 +0200 (CEST)

View full thread DBI::db disconnect invalidates statement handle