Schrift
[thread]3597[/thread]

DBI:mysql:... SELECT



<< >> 10 Einträge, 1 Seite
pearl-man
 2005-08-09 10:49
#33408 #33408
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Hi, hab wieder ma en Prob. Will folgende MySQL -Abfrage in Perl mit DBI realisieren:

SELECT user, name FROM tabelle WHERE user=$user && benannt=1

$user wird zuvor dynamisch initialisiert:

Code: (dl )
1
2
3
4
5
...
$user = "peter";

$sth=$dbh->prepare("SELECT user, name FROM tabelle WHERE user=$user && benannt=1");
...


, doch mit dieser Methode findet das Script keine Einträge in der Tabelle. Gebe ich den Wert des Feldes user (also user=) direkt an (also user="peter"), so funzt die Sache wie geschmiert. Kann man diese Abfrage auch mit ->do bauen? und wenn ja, wie?

mfg
renee
 2005-08-09 11:14
#33409 #33409
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
$user = "peter";

$sth=$dbh->prepare("SELECT user, name FROM tabelle WHERE user='$user' && benannt=1");


man beachte die ' !! sonst wird versucht user mit einer Spalte peter zu vergleichen, die es aber gar nicht gibt...

Im SQL schreibst Du ja auch "peter" und nicht einfach nur peter

aber besser Du benutzt die ?-Schreibweise:
Code: (dl )
1
2
3
4
$user = "peter";

$sth=$dbh->prepare("SELECT user, name FROM tabelle WHERE user=? && benannt=1");
$sth->execute($user);


Laut der Doku benutzt man do für non-SELECT-Statements...
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/
pearl-man
 2005-08-09 11:33
#33410 #33410
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für die schnelle Hilfe! Genau danach hab ich gsucht!
Strat
 2005-08-09 14:55
#33411 #33411
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
und fehler abfangen nach connect, prepare und execute nicht vergessen...

Nebenbei: AND ist portabler als &&
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
nepos
 2005-08-30 11:29
#33412 #33412
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Fuers Fehlerabfangen finde ich die Konstruktion mit eval recht gut.
Da musst du dann nicht nach jedem DB-Kommando nen or die "..." einbauen ;)
Gast Gast
 2005-08-30 15:02
#33413 #33413
Aber du behandelst die Fehler die auftreten doch hoffentlich?
Strat
 2005-08-30 17:54
#33414 #33414
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=nepos,30.08.2005, 09:29]Fuers Fehlerabfangen finde ich die Konstruktion mit eval recht gut.[/quote]
@nepos: Warum denn das?

mit eval kann man ja u.a. Programmabbrueche z.B. durch die() abfangen, und ein Programmabbruch bei DBI kommt normalerweise nur dann vor, wenn du mit RaiseError => 1 arbeitest.

wenn der Erfolg der Abfrage keine Rolle spielt, dann kannst du einfach auf das RaiseError => 1 verzichten, dann sparst du dir das eval drumherum (und auch ein bisschen laufzeit).

wenn der Erfolg der Abfrage hingegen eine Rolle spielt, dann musst du sowieso Fehler abfragen (oder besser sogar: abfangen). Und ohne RaiseError => 1 tauscht du eval + fehlerabfrage in nichts + fehlerabfrage um, also sparst dir das eval und kannst zusaetzlich kontrollierter auf den Fehler reagieren, weil du bestimmen kannst, wie die Fehlermeldung(en) ausgegeben werden, eventuell sogar alternativwege gehen kannst und nicht qualvoll $@ durchparsen musst.

Und wenn es in beiden Faellen Sinn macht, auf RaiseError => 1 und eval zu verzichten, warum es dann nicht einfach tun?

Code: (dl )
1
2
3
4
5
6
eval {
 $sth->execute($var1, $var2);
};
if ($@) {
 die "Error: $@\n";
}

Code: (dl )
1
2
3
unless ($sth->execute($var1, $var2)) {
 die "Error in executing sql: ", $dbh->errstr, "\n\tStatement was: $sql\n";
} # unless


oder siehst du das anders?\n\n

<!--EDIT|Strat|1125410174-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Heromaster
 2005-08-30 22:19
#33415 #33415
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
[quote=pearl-man,09.08.2005, 08:49]
Code: (dl )
1
2
3
4
5
...
$user = "peter";

$sth=$dbh->prepare("SELECT user, name FROM tabelle WHERE user=$user && benannt=1");
...
[/quote]
Sollte das nicht eher
Code: (dl )
$sth=$dbh->prepare("SELECT user, name FROM tabelle WHERE user=$user AND benannt=1");
lauten?
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Strat
 2005-08-31 16:15
#33416 #33416
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn $user von einem user eingegeben wird, sollte es auf jedem fall:
Code: (dl )
1
2
3
4
5
$user = "peter";
my $sql = "SELECT user, name FROM tabelle WHERE user=" . $dbh->quote($user) . " AND benannt=1";
unless ($sth=$dbh->prepare($sql)) {
die "Error in sql: ", $dbh->errstr, "\nSQL: $sql\n";
} # unless

oder aehnlich heissen (oder besser noch: renee's loesung mit platzhaltern ganz oben)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
nepos
 2005-09-09 11:54
#33417 #33417
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Strat: ich nutze das hier sehr viel mit ner Postgres-DBim Zusammenhang mit Transaktionen.
Vor allem isses nervig, bei zig Anweisungen immer so nen or die "blafasel" Teil anzuhaengen.
So mach ich halt bei mir immer
Code: (dl )
1
2
3
4
5
6
7
8
eval { ... mehrere SQL-Anweisungen in Transaktion ...};
if ($@) {
 $db->rollback;
 die $@;
}
else {
 $db->commit;
}


Ach ja, wenn man mit Platzhaltern arbeitet, dann erledigt DBI das quoten meines Wissens automatisch.
<< >> 10 Einträge, 1 Seite



View all threads created 2005-08-09 10:49.