Thread Mysql ergebnisse über Zeile und Namen ansprechen? (9 answers)
Opened by Samuel at 2010-12-11 11:41

ich
 2010-12-11 15:51
#143493 #143493
User since
2003-09-19
120 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo Samuel,

es gibt verschiedene Moeglichkeiten um auf eine Datenbank zuzugreifen. Einmal, das was du machst, quasi direkt drauf und dann gibt es auch noch die Moeglichkeit ueber einen OR-Mapper auf die Datenbank zuzugreifen. (http://de.wikipedia.org/wiki/OR_Mapper) z.B.: CPAN:http://search.cpan.org/~frew/DBIx-Class-0.08124/lib/DBIx/Class.pm (http://search.cpan.org/~frew/DBIx-Class-0.08124/li...).

Prinzipiell ist es aber ueberall gleich. Wenn du mehrere Zeilen aus einer Datenbank ausliest, dann will man die im normalfall auch irgendwo auflisten.
Holt man sich mehrere Zeilen aus einer Datenbank raus, will aber speziell auf nur eine Zeile zugreifen, dann hat man die Datenbankabfrage falsch gemacht (oder den Datenbankaufbau).

Ein schoenes Beispiel finde ich immer ein Gaestebuch, da man anhand von einem Gaestebuch schon alles Grundlegende erklaeren kann und die komplexitaet ist nicht sonderlich hoch. Hier zeige ich jetzt nurmal die Auflistung der Eintraege.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;
use warnings;
use DBI;
use CGI;

my $dbh = DBI->connect("DBI:mysql:database=mygb;host=localhost;port=3306", "mygbuser", "mygbpw");
my $cgi = CGI->new;

print $cgi->header;
print $cgi->start_html(-title => 'MyGuestbook');
print $cgi->h1('MyGuestbook / Alle Eintraege');

my $sth = $dbh->prepare("SELECT email, username, message FROM entries");
$sth->execute;

while(my $row = $sth->fetchrow_hashref) {
   print $cgi->ul({class => 'entrylist'}
      $cgi->li(
         $cgi->h1($cgi->a({href => $row->{'email'}}, $row->{'username'})),
         $cgi->div($row->{'message'})
      )
   );
}

print $cgi->end_html;


Will ich dagegen nur einen speziellen Eintrag haben.
Hier ist es auch besonders wichtig das du mit bind_param arbeitest. Da wenn du direkt das was man als Query-Parameter oder per POST uebergibt in einen SQL Query einbindest (ungeprueft) hast du sofort ein Problem mit SQL Injections.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use strict;
use warnings;
use DBI;
use CGI;

my $dbh = DBI->connect("DBI:mysql:database=mygb;host=localhost;port=3306", "mygbuser", "mygbpw");
my $cgi = CGI->new;

print $cgi->header;
print $cgi->start_html(-title => 'MyGuestbook');
print $cgi->h1('MyGuestbook / Ein Eintraeg');

my $eintrag = $cgi->param("entry");
my $sth = $dbh->prepare("SELECT email, username, message FROM entries WHERE entry_id=?");
$sth->bind_param(1, $eintrag);
$sth->execute;

my $eintrag = $sth->fetchrow_hashref;

print $cgi->ul({class => 'entrylist'}
   $cgi->li(
      $cgi->h1($cgi->a({href => $eintrag->{'email'}}, $eintrag->{'username'})),
      $cgi->div($eintrag->{'message'})
   )
);

print $cgi->end_html;


(der code ist ungetestet, also kann durchaus sein das irgendwo was nicht ganz richtig ist)

Gruss

Jan
If you tell the truth you don't have to remember anything.
-- Mark Twain

View full thread Mysql ergebnisse über Zeile und Namen ansprechen?