Klaus Mock: MySQL: $sth->finish; dazwischen rein? // doppelt $sth u. $dbh ??

Beitrag lesen

Hallo,

my $dbh = DBI->connect('DBI:mysql:database=foobar;host=localhost', '', '') || die $dbh->errstr;

$dbh->errstr ist im Fehlerfalle nicht auswertbar, da $dbh undefined ist. Verwende hier $DBI::errstr.

  1. Gehört das $sth->finish;  da dazwischen rein oder nicht?

Intern gibt afaik finish() nur offene Datenbank-Cursor frei, die bei Abfragen (SELECT) erzeugt werden. Einige DBD-Module geben eine Warnung aus, wenn solche Cursor nicht geschlossen werden bevor ein disconnect() erfolgt.

finish() ist in Deinem Falle alos imho Fleißarbeit.

Sollte ich beim 2. mal andere namen verwenden wie
$sth_2   und $dbh_2   damit das keine Probleme macht
weil da oben schonmal $dbh und $sth verwendet wurde??

Einen zweiten Datenbank-Handle zu öffnen ist mehr als überflüssig. Das bindet nur unnötige Ressourcen. Wenn DU eventuell mal auf eine ander Datenbank wechselst (z.B. Oracle) könnte das erhebliche Performanceeinbußen verursachen, da Oracle einen ziemlich aufwendigen Connect besitzt.

Zwei Statement-Handle können aber durchaus Sinn ergeben. Allein schon wegen der Übersicht und leichteren Lesbarkeit des Codes greife ich nur dann auf das neutrale $sth zurück, wenn der damit verbundene COde nicht so komplex ist, als dass der ganze Zusammenhang auf einem Blick ersichtlich ist.
Variablennamen sind ja u.a. deshalb frei wählbar, um damit auszudrücken, was 'in der Variable drinsteht'. $sth und $sth_2 ist ungefähr genauso aussagekräftig wie $foo und $bar. $sth_insert_customer bzw. $sth_update_foobar wäre imho wesentlich besser lesbar.

Grüße
  Klaus