Security ist ein stets aktuelles Thema in der IT. Deshalb widmet sich das ADMIN-Magazin 04/2012 speziell Sicherheitsaspekten und gibt Antworten auf die Fragen: ... (mehr)

Datenschaufel

Wie schon erwähnt kennt das DBI verschiedene Methoden, um an die Daten zu kommen, die die Datenbank ausspuckt. Dabei liefert »fetchrow_array()« einen Datensatz als Array, »fetchrow_arrayref()« dagegen eine Referenz auf ein solches Array. Schließlich gibt »fetchrow_hashref()« alternativ eine Referenz auf einen Hash zurück, dessen Schlüssel die Namen der Felder aus der Datenbank sind. Das geht einerseits etwas langsamer als mit den arraybasierten Zugriffsmethoden, andererseits muss man so nicht die Reihenfolge der Spalten (in der Datenbank oder in der SQL-Abfrage) kennen, um das Ergebnis zuordnen zu können.

Weil Abfragen nach dem Schema von Listing 2 besonders häufig sind, enthält das DBI auch ein paar Methoden höherer Ordnung, die den Prepare-, Execute- und Fetch-Teil in einem Statement zusammenfassen. Das sind »selectrow_array()« , »selectcol_arrayref()« und »selectall_arrayref()« . Neuere DBI-Versionen kennen außerdem »selectrow_arrayref()« , »selectrow_hashref()« und »selectall_hashref()« .

Ruft man »selectrow_array()« in einem Skalar-Kontext auf, dann liefert es nur die erste Spalte der ersten Zeile des Ergebnisses zurück. Das ist besonders praktisch, wenn man nur an der Anzahl der Resultate interessiert ist:

$anz=selectrow_array(SELECT COUNT(*) FROM testtab");

Generell geben alle Routinen, die Arrays liefern, eine leere Liste zurück, sobald die Ergebnismenge ausgeschöpft ist, und alle Routinen, die Referenzen liefern, retounieren in diesem Fall »undef« .

Ist man an allen Resultaten interessiert, eignen sich zur Abfrage daher Schleifen wie in Listing 3. Ein kleiner Trick dabei ist, »fetchrow_hashref()« über den Parameter zur Großschreibung der Schlüssel zu zwingen, sodass sie garantiert zur Schreibweise im »prinf« -Statement passen. Etwas bequemer kommt man mit einer Abfrage der höheren Ordnung zum selben Ziel (Listing 4).

Listing 4

In einem Schritt

 

Listing 3

Abfrageschleife

 

Platzhalter

In vielen Fällen will die Applikation nicht nur lesend auf die Datenbank zugreifen, sondern auch Inhalte verändern. DBI kennt für SQL-Statements, die keine Zeilen zurückgeben, die Methode »do()« .

$dbh->do("INSERT INTO adresses (name, street, nr) VALUES('guenther','nelkenweg',7)");

Auch »UPDATE« - oder »DELETE« -Anweisungen lassen sich via »do()« ausführen. Dabei gibt die Methode »undef« zurück, wenn es bei ihrer Ausführung zu einem Fehler kommt. Kann die Datenbank das Statement dagegen zwar ausführen, findet aber keine Zeile, auf die es zutrifft, liefert »do()« den Wert »0E0« zurück.

Zeichenketten in Insert- oder Update-Anweisungen müssen in Anführungszeichen stehen, was insofern ein kleines Problem heraufbeschwören kann, als bereits das SQL-Statement als solches an- und abgeführt werden muss. Dafür gibt es verschiedene Lösungen: Entweder man verwendet immer doppelte Anführungszeichen, muss dann aber diejenigen im Innern des SQL-Statements mit einem Backslash maskieren. Oder man setzt das SQL-Statement in einfache Anführungen, dann müssen doppelte im Innern nicht maskiert werden. Oder man verwendet Platzhalter.

Als Platzhalter dient das Fragezeichen an Stelle eines Datenwertes, der später nachgereicht wird. Besonders effizient ist diese Form dann, wenn ein und dieselbe Abfrage mit immer wechselnden Werten wiederholt wird. Dann kommt diese Technik auch der Performance zugute, denn die Datenbank muss nur einmal einen Ausführungsplan berechnen und kann ihn dann jedes Mal wiederverwenden. Das Beispiel in Listing 5 liest Daten aus einer CSV-Datei und speichert sie in einer Tabelle. Nebenbei: Diese Listings sollen nicht im Produktivbetrieb laufen, sondern nur DBI-Funktionen beispielhaft demonstrieren. Deshalb verzichten sie bewusst auf alles, was dafür verzichtbar ist, beispielsweise auch auf eine Fehlerbehandlung, wie man sie natürlich normalerweise bräuchte, um etwa leere oder falsch formatierte CSV-Zeilen abzufangen.

Listing 5

Datenimport

 

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019