Internet-Technologie
Description: Installation, Konfiguration und Ueberwachung von Serverdiensten unter Linux/UNIX, Internet-Technologie, Perl-Programmierung.
Keywords: UNIX Linux Internet Server Konfiguration Programmierung

| ### Internet-Technologie Prof. Jürgen Plate

## Übersicht: Portable DBI-Methoden

Die Perl-Methoden werden im Folgenden genauer erläutert. Die Variablen für die zurückgegebenen Werte haben folgende Bedeutung:

> `$dbh` | Datenbank-Handle
> `$sth` | Statement-Handle
> `$rc` | Rückgabe-Code (Status)
> `$rv` | Rückgabewert (Status)

`connect($datenquelle, $benutzername, $passwort)`
  Benutzen Sie die `connect`-Methode, um eine Verbindung zur Datenbank der Datenquelle herzustellen. Der `$datenquelle`-Wert sollte mit `DBI:Treiber_name:` beginnen. Beispielanwendungen von `connect` mit dem `DBD::mysql` Treiber:

      $dbh = DBI->connect("DBI:mysql:$datenbank", $benutzer, $passwort);
      $dbh = DBI->connect("DBI:mysql:$datenbank:$hostname",$benutzer, $passwort);
      $dbh = DBI->connect("DBI:mysql:$datenbank:$hostname:$port",$benutzer, $passwort);

  Wenn der Benutzername und/oder das Passwort nicht angegeben werden, verwendet `DBI` die Werte der `DBI_USER`- und `DBI_PASS`- Umgebungsvariablen. Wenn Sie keinen Hostnamen angeben, wird `'localhost'` verwendet. Wenn Sie keine Portnummer angeben, wird der MySQL-Port verwendet. Modifikatoren:

  `mysql_read_default_file=datei` | Liest `'datei'` als eine Optionsdatei.
  `mysql_read_default_group=group_name` | Beim Lesen einer Optionsdatei ist die Standardgruppe normalerweise die`[client]`-Gruppe. Wenn Sie die `mysql_read_default_group`- Option angeben, wird die Standardgruppe `[gruppenname]`.
  `mysql_compression=1` | Aktiviert die Kompression während der Kommunikation zwischen Client und Server.
  `mysql_socket=/pfad/zur/socket` | Gibt den Pfad des Unix-Sockets an, der zum Verbinden mit dem Ser verwendet wird.

  Sie können mehrere Modifikatoren angeben, dabei muss jedem ein Semikolon vorangestellt sein. Wenn Sie zum Beispiel vermeiden wollen, dass sie Benutzername und Passwort im `DBI`-Skript angeben müssen, können Sie sie aus der Optionsdatei `'~/.my.cnf'` nehmen. Ihr `connect`-Aufruf sieht folgendermaßen aus:

      $dbh = DBI->connect("DBI:mysql:$datenbank"
                     . ";mysql_read_default_file=$ENV{HOME}/.my.cnf",
                      $benutzer, $passwort);

  Dieser Aufruf liest die Optionen für die `[client]`-Gruppe aus der Optionsdatei. Wenn Sie dasselbe für die `[perl]`-Gruppe tun wollen, könnte Ihr Code so aussehen:

      $dbh = DBI->connect("DBI:mysql:$Datenbank"
                      . ";mysql_read_default_file=$ENV{HOME}/.my.cnf"
                      . ";mysql_read_default_group=perl",
                      $benutzer, $passwort);

`disconnect`
  Die `disconnect`-Methode beendet die Verbindung mit der Datenbank. Dies wird typischerweise kurz vor dem Ende eines Scripts ausgeführt. Beispiel:

      $rc = $dbh->disconnect;

`prepare($statement)`
  Bereitet ein SQL-Statement zum Ausführen durch den Datenbankserver vor und gibt ein "Statement-Handle" `($sth)` zurück, mit der Sie die `execute`-Methode aufrufen. Normalerweise werden Sie `SELECT`-Statements (und `SELECT`-ähnliche Statements so wie `SHOW`, `DESCRIBE` und `EXPLAIN`) mit der Bedeutung von `prepare` und `execute` verwenden. Beispiel:

      $sth = $dbh->prepare($statement)
          or die "$statement: $dbh->errstr kann nicht vorbereitet werden\n";

`execute`
  Die `execute`-Methode führt ein vorbereitetes Statement aus. Bei Nicht-`SELECT`-Statements gibt `execute` die Anzahl der betroffenen Zeilen zurück. Wenn Zeilen betroffen sind, gibt `execute` `"0E0"` zurück, was in Perl als 0 und true erkannt wird. Wenn ein Fehler auftritt, gibt `execute` `undef` zurück. Bei `SELECT`-Statements beginnt `execute` die SQL-Anfrage in der Datenbank; Sie müssen eine der `fetch_*`-Methoden nutzen, die weiter unten beschrieben sind, um Daten erhalten. Beispiel:

      $rv = $sth->execute
                or die "Die Query: $sth->errstr kann nicht ausgeführt werden.";

`do($statement)`
  Die `do`-Methode bereitet ein Statement vor, führt es aus und gibt die Anzahl der betroffenen Zeilen zurück. Wenn Zeilen betroffen sind, gibt `execute` `"0E0"` zurück, was in Perl als 0 und true erkannt wird. Diese Methode wird normalerweise verwendet, um Nicht-`SELECT`-Statements zu bearbeiten, die (z. B. wegen Treiber-Beschränkungen) nicht vorbereitet werden können, oder die nicht mehr als einmal vorbereitet werden müssen (INSERTS, DELETE usw.). Beispiel:

      $rv = $dbh->do($statement)
              or die "$statement: $dbh- >errstr kann nicht vorbereitet werden\n";

  Im Allgemeinen ist die `do`-Methode VIEL schneller (und vorzuziehen) als die `prepare`/`execute`-Methoden, die ohne Parameter aufgerufen werden.

`quote($string)`
  Die `quote`-Methode wird verwendet, um Sonderzeichen zu "escapen", die in Zeichenketten enthalten sein können, und um notwendige äußere Anführungszeichen hinzuzufügen. Beispiel:

      $rv = $dbh->quote($string)

`fetchrow_array`
  Die Methode holt die nächste Datenzeile und gibt sie als ein Array mit den Feldwerten zurück. Beispiel:

      while(@row = $sth->fetchrow_array)
        {
        print "$row[0]  $row[1]  $row[2]\n";
        }

`fetchrow_arrayref`
  Die Methode holt die nächste Datenzeile und gibt sie als eine Referenz auf ein Array mit den Feldwerten zurück. Beispiel:

      while($row_ref = $sth->fetchrow_arrayref)
        {
        print "$row_ref->[0]  $row_ref->[1]  $row_ref->[2]\n";
        }

`fetchrow_hashref`
  Diese Methode holt eine Datenzeile und gibt eine Referenz auf einen Hash zurück, der Name-/Wert-Paare enthält. Die Methode ist lange nicht so performant wie das Verwenden von Referenzen auf ein Array, wie weiter oben beschrieben ist. Beispiel:

      while($hash_ref = $sth->fetchrow_hashref)
        {
        print "$hash_ref->{vorname}";
        print "$hash_ref->{nachname}";
        print "$hash_ref->{title}\n";
        }

`fetchall_arrayref`
  Diese Methode gibt alle Zeilen eines Ergebnisses einer SQL-Anfrage zurück. Sie gibt eine Referenz auf ein Array mit Referenzen auf Arrays mit den Werten der einzelnen Zeilen zurück. Sie können mit zwei verschachtelten Schleifen auf die Werte zugreifen. Beispiel:

      my $table = $sth->fetchall_arrayref
                      or die "$sth->errstr\n";
      my($i, $j);
      for $i ( 0 .. $#{$table} )
        {
        for $j ( 0 .. $#{$table->[$i]} )
          {
          print "$table->[$i][$j]  ";
          }
        print "\n";
        }

`finish`
  Bewirkt, dass keine weiteren Daten von dem SQL-Anfrageergebnis geholt werden. Sie können diese Methode aufrufen, um Systemressourcen freizugeben. Beispiel:

      $rc = $sth->finish;

`rows`
  Gibt die Anzahl der veränderten Zeilen (die aktualisiert oder gelöscht wurden) des letzten Befehls zurück. Dies wird normalerweise nach Nicht-`SELECT`-`execute`-Statements verwendet. Beispiel:

      $rv = $sth->rows;

`NULLABLE`
  Gibt eine Referenz auf ein Array mit Boole'schen Werten zurück; für jedes Element TRUE kann die Spalte `NULL`-Werte enthalten. Beispiel:

      $rv = $sth->{NULLABLE};

`NUM_OF_FIELDS`
  Dieses Attribut enthält die Anzahl der Zeilen, die eine `SELECT`- oder `SHOW FIELDS`-SQL-Anfrage zurückgibt. Sie können es verwenden, um zu prüfen, ob eine Anfrage ein Ergebnis zurückgegeben hat: 0 weist auf eine Nicht-`SELECT`-Anfrage hin, wie `INSERT`, `DELETE` oder `UPDATE`. Beispiel:

      $rv = $sth->{NUM_OF_FIELDS};

`datasource($Treiber_name)`
  Diese Methode gibt einen Array zurück, der die Namen der verfügbaren Datenbanken auf `'localhost'` enthält. Beispiel:

      @dbs = DBI->datasource("mysql");

`ChopBlanks`
  Dieses Attribut gibt an, ob die `fetchrow_*`-Methoden vor- und nachstehende Leerzeichen entfernen. Beispiel:

      $sth->{'ChopBlanks'} = 1;

`trace($trace_ebene)`
`trace($trace_ebene, $trace_dateiname)`
  `trace` aktiviert oder deaktiviert "Tracing". Wenn `DBI` als eine Klassenmethode aufgerufen wird, steuert es das "Tracing" mit allen Datenbankverbindungen. Wenn es als Datenbank- oder Statement-Handle-Methode aufgerufen wird, steuert es nur die verwendete Verbindung (und deren spätere Ableitungen). Wenn Sie `$trace_ebene` auf 2 setzen, bewirkt es detaillierte Informationen. Der Wert 0 stellt "Tracing" ab. Die Ausgabe des "Tracing" wird vorgabemäßig nach "standard error" geleitet. Wenn `$trace_dateiname` angegeben ist, wird die Ausgabe für alle "getraceten" Verbindungen an das Ende dieser Datei geschrieben. Beispiel:

      DBI->trace(2);                # alles tracen
      DBI->trace(2,"/tmp/dbi.out"); # alles nach /tmp/dbi.out tracen
      $dth->trace(2);               # diese Datenbankverbindung tracen
      $sth->trace(2);               # dieses Statement-Handle tracen.

  Sie können `DBI`-Tracing auch anschalten, indem Sie die `DBI_TRACE`-Umgebungsvariable setzen. Wenn Sie sie auf einen numerischen Wert setzen, ist das dasselbe, wie `DBI->(wert)` aufzurufen. Wenn Sie sie auf einen Pfadnamen setzen, ist das dasselbe, wie `DBI->(2,wert)` aufzurufen.

###### Copyright © FH München, FB 04, Prof. Jürgen Plate