|
| 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.
| |
|
|