Schrift
[thread]3421[/thread]

join & dbh->quote()



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
pktm
 2004-03-19 09:00
#31839 #31839
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich erstelle so ein SQL-Statement aus einer Hashreferenz:
Code: (dl )
1
2
3
4
5
            my $sql = "INSERT INTO db (";
$sql .= join", ", keys( %{$ref} );
$sql .= ") VALUES ('";
$sql .= join", ",values( %{$ref} );
$sql .= "')";

Jetzt habe ich da nur das problem, dass die Daten bei $sql .= join", ",values( %{$ref} ); nicht gequotet werden.
Sollten sie aber besser (per dbh->quote() ) weil ich z.B. auch ' in den Daten habe.
Kann ich das irgendwie in das join einbauen oder muss ich extra eine foreach-Schleife bauen?

Dann abgesehen davon würd eich ncoh gerne wissen, ob eine join-Anweisung das Selbe ist wie eine foreach-Schleife (der Komplexität halber).
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
format_c
 2004-03-19 10:16
#31840 #31840
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
           my $sql = "INSERT INTO db (";
          $sql .= join", ", map {$dbh->quote($_)} keys( %{$ref} );
          $sql .= ") VALUES ('";
          $sql .= join", ", map {$dbh->quote($_)} values( %{$ref} );
          $sql .= "')";


Gruß Alex\n\n

<!--EDIT|format_c|1079685424-->
format_c
 2004-03-19 10:47
#31841 #31841
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Quote
Dann abgesehen davon würd eich ncoh gerne wissen, ob eine join-Anweisung das Selbe ist wie eine foreach-Schleife (der Komplexität halber).

Also als Foreach würde ich nicht machen.
Wenn ich mir ein eigenes join basteln würde würde ich das so machen.

Code: (dl )
1
2
3
4
{
local $, = ', ';
print @list;
}


Gruß Alex
ptk
 2004-03-19 11:32
#31842 #31842
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Auch in solchen Faellen ist es besser, den Platzhalter-Mechanismus von DBI zu nutzen. Ungefaehr so (ungetesteter Code):
Code: (dl )
1
2
3
4
5
6
my $sql = "INSERT INTO db (";
$sql .= join", ", keys( %{$ref} );
$sql .= ") VALUES (";
$sql .= join", ", map { "?" } values( %{$ref} );
$sql .= ")";
my @bind = values %$ref;
format_c
 2004-03-19 13:48
#31843 #31843
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
OK dann muss das quote halt beim execute gemacht werden. Aber diese Platzhalter vergesse ich jedesmal.

Gruß ALex
format_c
 2004-03-19 13:57
#31844 #31844
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=ptk,19.03.2004, 10:32]Auch in solchen Faellen ist es besser, den Platzhalter-Mechanismus von DBI zu nutzen. Ungefaehr so (ungetesteter Code):
Code: (dl )
1
2
3
4
5
6
my $sql = "INSERT INTO db (";
$sql .= join", ", keys( %{$ref} );
$sql .= ") VALUES (";
$sql .= join", ", map { "?" } values( %{$ref} );
$sql .= ")";
my @bind = values %$ref;
[/quote]
Das tät ich dann allerdings so machen.

Code: (dl )
1
2
3
4
5
6
7
my $sql = "INSERT INTO db (";
$sql .= join", ", keys( %{$ref} );
$sql .= ") VALUES (";
$sql .= join", ", map {"?"} (1 .. scalar(values(%$ref)));
$sql .= ")";
my $sth = $dbh->prepare($sql) or die DBI::errstr;
$sth->execute(map {$dbh->quote($_)} values %$ref) or die DBI::errstr;


Gruß Alex
Edit: Code korrigiert.\n\n

<!--EDIT|format_c|1079697775-->
ptk
 2004-03-19 13:59
#31845 #31845
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Nein, wenn man Platzhalter benutzt, muss man sich um das Quoten niemals kuemmern. Das passiert dann intern. Ausserdem bilde ich mir immer ein, das wiederverwendbare Statements mit Platzhaltern schneller (geparset|ausgefuehrt|was auch immer) werden.
format_c
 2004-03-19 14:01
#31846 #31846
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ok wenn das so ist ist mein Code natürlich völliger Schwachsinn. Wusste ich nicht.

Gruß Alex
Heromaster
 2004-03-19 16:16
#31847 #31847
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,19.03.2004, 12:59]Nein, wenn man Platzhalter benutzt, muss man sich um das Quoten niemals kuemmern. Das passiert dann intern. Ausserdem bilde ich mir immer ein, das wiederverwendbare Statements mit Platzhaltern schneller (geparset|ausgefuehrt|was auch immer) werden.[/quote]
Nein, das ist keine Einbildung, die Du da hast. Laut perldoc DBI laufen Statements mit Platzhaltern um einiges schneller als normale Statements, wenn sie wiederverwendet werden :) (das Statement scheint dabei serverseitig im Cache zu landen, da nicht alle SQL-Server Platzhalter unterstützen.)
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Strat
 2004-03-19 18:10
#31848 #31848
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei "groesseren" Datenbanken wie Sybase, Oracle und DB/2 habe ich da schon ziemliche Unterschiede gemessen, gerade, wenn man das execute wiederholt ausfuehrt. Bei MySql habe ich noch nicht gemessen, aber mir fiel da bisher noch kein Gewinn auf (hat mal jemand Lust, da was zu Benchmarken?)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2004-03-19 09:00.