Schrift
[thread]9053[/thread]

Allg. Frage zum Speichern von Datenbankabfragen: DBI

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Duff
 2007-05-31 13:00
#77148 #77148
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe mal eine allgemeine Frage zu SELECT-Statements auf DB bzw. zum Speichern des Resultats der Abfrage.

Eine Möglichkeit wäre ja diese hier:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sub db_function {
my $dbh = shift;
my $str = shift;
$sql = "SELECT *.... where blablabla = '$str'";

my $sth = $dbh->prepare($sql) or die 'Fehler:', $DBI::errstr, "\n";
$sth->execute();

# wird der Status 1 oder 0 in $result gespeichert
my $result = $sth->fetchrow_array();
# oder alles in einem Array speichern
# my @result = $sth->fetchrow_array();


return $result;
}

$dbh = DBI->connect("dbi:Oracle:$db_name",$db_username,$db_password, \%attr) or die "Fehler beim Datenbankconnect: $DBI::errstr";

my $db_result = db_function($dbh,$string);
print "$db_result\n";

$dbh->disconnect();


Wie soll man am besten aus einer DB die Daten auslesen bzw. wo gibt es eine gute Übersicht darüber, welche Syntax man wie verwendet???
D'OH
Daniel
pq
 2007-05-31 13:23
#77149 #77149
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also schonmal gleich am anfang: *immer* platzhalter verwenden,
stichwort sql-injection.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Duff
 2007-05-31 13:27
#77150 #77150
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Sorry, aber wie und was genau meinst du?
D'OH
Daniel
pq
 2007-05-31 13:51
#77151 #77151
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wenn in deinem beispiel $str z.b. von einem user kommt (per CGI),
kann der da sql reinschreiben und somit z.b. bewirken, dass viel mehr
resultate ausgelesen werden. egal, was er damit anstellen kann - er kann
auf jeden fall das sql beeinflussen, und das will man ja nicht.
aber auch selbst kann man sdich mal vertun. deswegen platzhalter
verwenden.
Code: (dl )
1
2
3
4
5
       my $str = shift;
      my $sql = "SELECT *.... where blablabla = ?";

      my $sth = $dbh->prepare($sql) or die 'Fehler: $DBI::errstr\n";
      $sth->execute($str);
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Duff
 2007-05-31 14:03
#77152 #77152
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Achso, die Platzhalte sind die ?-Zeichen, von denen man auch mehrere in einem SELECT verwenden kann, oder?

Was ich z.b. such ist, wie für folgende Liste die kompletten, einzelnen SQL-Anweisungen aussehen müssten/sollten:
(perldoc DBI)
Code: (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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        @driver_names = DBI->available_drivers;
@data_sources = DBI->data_sources($driver_name, \%attr);

$dbh = DBI->connect($data_source, $username, $auth, \%attr);

$rv = $dbh->do($statement);
$rv = $dbh->do($statement, \%attr);
$rv = $dbh->do($statement, \%attr, @bind_values);

$ary_ref = $dbh->selectall_arrayref($statement);
$hash_ref = $dbh->selectall_hashref($statement, $key_field);

$ary_ref = $dbh->selectcol_arrayref($statement);
$ary_ref = $dbh->selectcol_arrayref($statement, \%attr);

@row_ary = $dbh->selectrow_array($statement);
$ary_ref = $dbh->selectrow_arrayref($statement);
$hash_ref = $dbh->selectrow_hashref($statement);

$sth = $dbh->prepare($statement);
$sth = $dbh->prepare_cached($statement);

$rc = $sth->bind_param($p_num, $bind_value);
$rc = $sth->bind_param($p_num, $bind_value, $bind_type);
$rc = $sth->bind_param($p_num, $bind_value, \%attr);

$rv = $sth->execute;
$rv = $sth->execute(@bind_values);

$rc = $sth->bind_param_array($p_num, $bind_values, \%attr);
$rv = $sth->execute_array(\%attr);
$rv = $sth->execute_array(\%attr, @bind_values);

$rc = $sth->bind_col($col_num, \$col_variable);
$rc = $sth->bind_columns(@list_of_refs_to_vars_to_bind);

@row_ary = $sth->fetchrow_array;
$ary_ref = $sth->fetchrow_arrayref;
$hash_ref = $sth->fetchrow_hashref;

$ary_ref = $sth->fetchall_arrayref;
$ary_ref = $sth->fetchall_arrayref( $slice, $max_rows );
D'OH
Daniel
renee
 2007-06-01 12:09
#77153 #77153
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Statements können beliebige SQL-Befehle sein... Kannst Du Deine Frage etwas genauer eingrenzen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
nepos
 2007-06-01 14:09
#77154 #77154
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Bei den selectxxx_xxx()-Funktionen machen nur SELECT-Statements Sinn. Ansonsten hat renee alles gesagt :)

Schau doch auch mal im Web, da gibts sicher das ein oder andere Tutorial zu DBI.
Duff
 2007-06-01 21:48
#77155 #77155
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Was ich meine ist, dass ich nicht genau weiß, wenn ich die Daten in einem Array, oder ArrayReferenz, oder was auch immer speichern möchte, die Syntax aussieht.

Muss ich für alle Arten zum Speichern folgende Syntax verwenden?

Code: (dl )
1
2
3
4
5
      my $str = shift;
my $sql = "SELECT *.... where blablabla = ?";

my $sth = $dbh->prepare($sql) or die 'Fehler: $DBI::errstr\n";
$sth->execute();
\n\n

<!--EDIT|Duff|1180720124-->
D'OH
Daniel
Strat
 2007-06-02 11:26
#77156 #77156
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
bei den meisten Datenbanken ist es wichtiger, ->execute auf fehler zu ueberpruefen als ->prepare. also immer beide ueberpruefen, z.B.
Code: (dl )
1
2
3
4
my $sth = $dbh->prepare( $sql )
or die "Error in preparing SQL: $DBI::errstr\nSQL: $sql\n\n";
$sth->execute( @placeholders )
or die "Error in executing SQL: ", $sth->errstr, "\n";
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2007-06-02 11:31
#77157 #77157
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, zum speichern wuerde ich diese syntax verwenden. du hast danach die Wahl, ob du dir das result als array, arrayref oder hashref zurueckgeben lassen willst. Wenn du mit SELECT * arbeitest, ist IMHO die einzig sichere Methode die folgende:
Code: (dl )
1
2
3
while( my $dataHashRef = $sth->fetchrow_hashref ) {
# mach was mit $dataHashRef
}

Mit ->fetchrow und ->fetchrow_arrayref kann man nur dann sicher arbeiten, wenn man die Reihenfolge der Felder im select fix angibt (also ohne *). Denn wenn da mal jemand die Datenbank neu anlegt oder erweitert, fliegt das Script sonst ( bei * und array) auf die Nase...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use Data::Dumper;
my $placeHolder1 = 20;
my $sql = 'SELECT *.... where blablabla = ?';

my $sth = $dbh->prepare( $sql )
or die "Error in preparing SQL: $DBI::errstr\nSQL: $sql\n\n";
$sth->execute( $placeHolder1 )
or die "Error in executing SQL: ", $sth->errstr, "\n";

while( my $data = $sth->fetchrow_hashref ) {
print Dumper( $data );
} # while
$sth->finish;
\n\n

<!--EDIT|Strat|1180769531-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-05-31 13:00.