ABSTRACT: perl: zugriff auf mysql von perl scripts aus AUDIENCE: perl beginners SYSTEM: any unix SECTION: perl AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt jetzt kennen wir einwenig perl und auch mysql. was liegt naeher als die beiden zu verbinden? haendisches absetzten von INSERT sql befehlen am mysql prompt ist ohnehin eine sehr muehsame art seine datebanken zu verwalten. zum zugriff auf mysql von perl aus gibt es wieder ein perl modul. d.h. eigentlich 2 module. das DBI modul stellt ein abstraktes datenbank interface dar, das DBD::mysql macht dann die konkrete anbindung an die mysql datenbank. will man sein script z.b. von mysql auf die postgres datenbank umstellen so braucht man im besten falle nur eine zeile zu aendern. use DBI; use DBD::mysql; obiges sagt dem perl dass wir diese module verwenden wollen. my $dbh=DBI->connect("dbi:mysql:cocktails:", "maxmeier", "geheim") or die "kann nicht auf datenbank zugreifen\n"; obiges oeffnet eine verbindung zur datenbank. die verbindung wir hier in dem object $dbh gespeichert. wir koennen dieses objekt ab jetzt benutzen um auf die datenbank zuzugreifen. die einfachste variante ist dabei die ->do() methode: $dbh->do("insert into cocktails (name,preis) values('bloody marry',8.5)"); die do methode fuehrt den sql befehl sofort aus. meist will man natuerlich nicht konstanten sondern variablen eintragen. ein beliebter fehler ist es einfach string substitution zu verwenden um den sql befehl zu erzeugen. man sollte es aber so machen: $drinkname='bloody marry'; $preis=8.50; $sql= "insert into cocktails (name,preis) values(" . $dbh->quote($drinkname) . "," . $dbh->quote($preis) . ")" ; $dbh->do($sql); die funktion $dbh->quote() fuegt zum string die anfuehrungszeichen hinzu und sort dafuer dass bereits im text vorhandenen anfuehrungszeichen richtig mit escape sequenzen versehen werden.. (anosnsten wuerde ein im einzusetzendes text unseren sql befehl total zerstoeren.. und unter umstaenden sogar beliebige sql funktionen ausfuehren...) hat man sql befehle die ergebnisse zurueckliefern (vorwiegend SELECT) so verwendet man z.b. folgende form: my $sth=$dbh->prepare("select * from cocktails"); $sth->execute(); while(my $href=$sth->fetchrow_hashref()) { print $href->{"name"},"\n"; } $sth->finish(); das $dbh->prepare bereitet das sql statment zur aufuehrung vor und liefert ein objekt zurueck mit dem man das satement dann ausfuehren kann. ->execute() (fuehrt dann das statement aus. ->fetchrow_hasref liefert eine refernez auf einen hash zurueck (ueber refernezen lernen wir noch. man kann sie wie normale hases verwenden nur schreibt man vor der {} ein -> ) das $sth->finnish(); besagt dass wir keine weitren daten aus diesem select mehr abfragen wollen. $dbh->disconnect() schliesst am ende die datenbank verbindung wieder. while(my $href=$sth->fetchrow_hashref()) { foreach my $k (keys %$href) { print $href->{"$k"}," "; } print "\n"; } $sth->finish(); wuerde alle spalten mit allen zeilen einer ergebnisstabelle ausgeben. EXERCISES: * schreibe ein kurzes perl script dass das einfuegen von drinks in die tabelle erlaubt in dem man das scipt mit 2 parametern name und preis aufruft. zb.: ./drinkdb.pl caprinha 7.20 wenn man das script ohne parameter aufruft soll es eine liste aller drinks ausgeben. * schreibe obiges script um in ein CGI script das die cocktails anzeigt und das einfuegen neuer cocktails via forumlar erlaubt. achte auf sicherheitsaspekte. * schreibe ein script dem man den namen einer datenbank ueberigbt und das dann alle tabellen dieser datenbank ("show tables") und dann alle felder aller tabellen ausgibt. REFERENCES: perldoc CGI perldoc DBD::mysql perldoc DBI