Aqua: Modul DBI - $sth->errstr; oder $dbh->errstr; ??

Hallo!

Es geht um das Modul DBI.
Die Dokumentation habe ich gelesen,
und so gut bzw. so schlecht mein englisch auch ist,
verstand ich teils mehr, teils weniger.

Jedenfalls blieben einige Sachen unklar für mich:

1)  Ist es $dbh->errstr; oder $sth->errstr; ?

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

my $sth = $dbh->prepare("INSERT INTO customers VALUES (?, ?)");
$sth->execute('',"Aqua");

==================

$dbh  connectet ja die Datenbank,
$sth wird dann $dbh->prepare zugewiesen,
also irgendwie bleibt es in $dbh,
irgendwie geht es nach $sth,
und zum schluss gibt es ein $sth->execute.

In der perldoc DBI bzw. der Modulbeschreibung von DBI.pm
fand ich beides,  sowohl

$sth->errstr;   als auch   $dbh->errstr;

Es ist mir unklar welches ich wann wie warum brauche....

wenn ich bei obigem Script $dbh->errstr;  drunterschreibe,
steht dann da nur der Fehler aus dem "connect" drinnen?

Oder auch der andere?

Wenn ich einen  doppelten Eintrag habe in der Tabelle
in einer UNIQUE Spalte bei obigem Script bekomme
ich sowohl bei $dbh->errstr; als auch bei $sth->errstr;
den fehler retour.

Was aber wenn ich bei PREPARE schon einen Error bekomme,
und es zu  execute  gar nicht mehr kommt,
dann ist der error in DBH oder?

Aber was ist dann $sth->execute?
das macht ja mehr sinn wenn der fehler im Execute kommt
weil dann ist es ja schon in $sth ?

Irgendwo sollte ja ein Objekt retour gegeben werden?
was hilft mir das eigentlich zu wissen?

Bitte helft mir,
ich blicke mich da nicht mehr durch, bitte =(

Aqua ...

Danke

  1. Hallo Aqua,

    1)  Ist es $dbh->errstr; oder $sth->errstr; ?
    In der perldoc DBI bzw. der Modulbeschreibung von DBI.pm
    fand ich beides,  sowohl
    $sth->errstr;   als auch   $dbh->errstr;

    Du hast zwei Objekte mit gleichnamigen Methoden, das mag dich verwirren. $dbh ist dein Datenbankhandle, während $sth der Statementhandler ist. Beide haben die Methode errstr. Beginnen wirst du immer, indem du versuchst, mit folgender Anweisung eine Verbindung zur Datenbank herzustellen:

    $dbh = DBI->connect($data_source, $username, $auth, %attr) || die $DBI::erstr;

    Du siehst, geht bei der Erzeugung des neuen DB-Handles etwas schief, wird der entsprechende Fehler abgefangen und ausgegeben.

    Nehmen wir an, alles ist gut gegangen. Nun willst du eine DB-Abfrage realisieren, wozu du natürlich erst mal das entsprechende Statementhandle-Objekt erzeugen musst:

    $sth = $dbh->prepare($statement) || die $dbh->errstr;

    Geht hier etwas schief, liefert dir die Methode errstr des Datenbankhandles $dbh die entsprechende Fehlermeldung. $sth->errstr liefert dir hier noch nichts, denn beim Erzeugen des Objektes $sth ist irgendwas schief gegangen, weshalb dir dieses Objekt mit seinen Methoden nicht zur Verfügung steht.

    Im Erfolgsfall kannst du mit dem Objekt $sth und seinen Methoden (u.a. errstr) weitermachen, z.B. das Statement ausführen:

    $rv = $sth->execute || die $sth->errstr; # Siehe Doku ;-)

    Du siehst, jetzt hilft dir $dbh->errstr nicht weiter, denn da war ja die Perlwelt noch in Ordnung. Du willst aber wissen, welchen Fehler du beim Aufruf der Methode execute des Objektes $sth erhältst, musst also logischerweise $sth->errstr benutzen.

    Es ist mir unklar welches ich wann wie warum brauche....

    Faustformel:
    Aufruf einer Datenbankhandle-Methode: $dbh->errstr
    Aufruf einer Statementhandle-Methode: $sth->errstr

    Hoffe es hilft
    Torsten

    PS: http://www.thomas-fahle.de/pub/perl/DBI/DBI.html

    1. Hallo Torsten!

      Danke für Deine liebe Antwort,
      die ist toll!

      Ich habe Dir gerade versucht über Deine Homepage eine E-Mail
      zu senden aber da bekomme ich folgende Meldung wenn
      ich sie versuche abzusenden:

      Ihre E-Mail wurde am [an error occurred while processing this directive] versandt.

      Es könnte also sein dass Du keine Mail bekommen hast.

      Könntest du dich also bitte kurz bei mir melden?
      ICQ 283295157 oder  Mail:   aquariophile@gmx.de

      Vielen lieben Dank!
      Aqua

      1. Hallo Aqua,

        Ich habe Dir gerade versucht über Deine Homepage eine E-Mail
        zu senden aber da bekomme ich folgende Meldung wenn
        ich sie versuche abzusenden:
        Ihre E-Mail wurde am [an error occurred while processing this directive] versandt.

        Nein, kein Problem, ich hatte nur mein CGI-BIN Verzeichnis aufgeräumt und versehentlich ein Skript zuviel gelöscht. Geht jetzt wieder.

        Könntest du dich also bitte kurz bei mir melden?

        Lass uns doch an dieser Stelle weiter nach einer Lösung suchen, damit auch andere mit einem gleichen oder ähnlichen Problem etwas davon haben :-)

        Grüße
        Torsten

        --
        Für euch gehört und bewertet: http://www.siechfreds-welt.de/impnaz.shtml