/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Klippe-klistre SQL :-/
Fra : Jens Thomsen


Dato : 08-06-08 20:16

Jeg er endt i en lidt irriterende situation, hvor jeg har en hash med
keys/values til en MySQL tabel i.

Det er ikke umiddelbart muligt indenfor tidsrammen at nå at anvende de
abstraktionslag Adam henviste til i en anden tråd.

Jeg skal altså bygge SQL'en ud fra hashen og det er lidt besværligt at gøre
ret kønt!

F.eks.

INSERT INTO [table]
SET
x = ?,
y = ?

Jeg havde tænkt mig at anvende placeholders, men det bliver vist noget
virkeligt rod med eval() når værdierne skal stoppes i.

Alternativet er at bygge hele SQL'en med værdierne i, men så skal jeg jo
forholde mig til SQL injection.

Måske der findes et modul eller noget der quoter alt farligt stads?

Eller er der en åbenlys ting jeg overser?



 
 
Christian Laursen (08-06-2008)
Kommentar
Fra : Christian Laursen


Dato : 08-06-08 20:31

"Jens Thomsen" <jt@nej.nej> writes:

> Jeg er endt i en lidt irriterende situation, hvor jeg har en hash med
> keys/values til en MySQL tabel i.
>
> Det er ikke umiddelbart muligt indenfor tidsrammen at nå at anvende de
> abstraktionslag Adam henviste til i en anden tråd.
>
> Jeg skal altså bygge SQL'en ud fra hashen og det er lidt besværligt at gøre
> ret kønt!
>
> F.eks.
>
> INSERT INTO [table]
> SET
> x = ?,
> y = ?
>
> Jeg havde tænkt mig at anvende placeholders, men det bliver vist noget
> virkeligt rod med eval() når værdierne skal stoppes i.

Så slemt er det vist heller ikke.

$sth = $dbh->prepare("INSERT INTO table (" . join (",", keys %hash) . ") VALUES (" . join(",", ("?") x keys %hash) . ")");
$sth->execute(values %hash);

--
Christian Laursen

Jens Thomsen (09-06-2008)
Kommentar
Fra : Jens Thomsen


Dato : 09-06-08 07:01


"Christian Laursen" <xi@borderworlds.dk> wrote in message
news:ygf3ann9129.fsf@dominion.borderworlds.dk...
> Så slemt er det vist heller ikke.
>
> $sth = $dbh->prepare("INSERT INTO table (" . join (",", keys %hash) . ")
> VALUES (" . join(",", ("?") x keys %hash) . ")");
> $sth->execute(values %hash);

Jamen dog, der var jo en åbenbar løsning

Som Michael også nævner så kan execute() tage en liste af værdier, og det
anede jeg ikke. Troede man skulle angive dem een efter hinanden og derfor
tænkte jeg eval().

Meget smukt! Tak



Michael Zedeler (08-06-2008)
Kommentar
Fra : Michael Zedeler


Dato : 08-06-08 20:46

Jens Thomsen wrote:
> Jeg er endt i en lidt irriterende situation, hvor jeg har en hash med
> keys/values til en MySQL tabel i.
>
> Det er ikke umiddelbart muligt indenfor tidsrammen at nå at anvende de
> abstraktionslag Adam henviste til i en anden tråd.
>
> Jeg skal altså bygge SQL'en ud fra hashen og det er lidt besværligt at gøre
> ret kønt!
>
> F.eks.
>
> INSERT INTO [table]
> SET
> x = ?,
> y = ?
>
> Jeg havde tænkt mig at anvende placeholders, men det bliver vist noget
> virkeligt rod med eval() når værdierne skal stoppes i.

Jeg kan ikke lige se hvorfor du skulle løbe ind i at skulle bruge eval,
blot fordi du skal skrive noget der kan finde ud af at hælde værdierne
fra en hashtabel i en mysql-tabel. Execute tager jo en liste af værdier,
så hvad er problemet lige?

> Alternativet er at bygge hele SQL'en med værdierne i, men så skal jeg jo
> forholde mig til SQL injection.

Ja. Det er en rigtig skidt løsning.

> Måske der findes et modul eller noget der quoter alt farligt stads?
>
> Eller er der en åbenlys ting jeg overser?

Ja. Du kan klare dig uden eval. Med mindre du har udeladt noget, kan man
skrive koden på ca. 20 linier.

Bring din kode her, hvis du gerne vil diskutere hvordan.

Mvh. Michael.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste