Rob Roudebush wrote at Tue, 11 Jun 2002 03:07:44 +0200:

>  I have the following code  - when someone enters a whatever ' whatever into one of 
>my forms my
>  script dies because of the single quote. Arrrrggg... of course the first time I 
>come across it is
>  when my boss is testing out the script.

Your script would be better to read with a here document and 
the typical style for SQL statements (keys words uppercase):

>   $sth = $dbh->do( "insert into maintenance (owner, email, maintype, title, 
>requested, engineer,
>   ticket, impact, comm,
> dispo, dispodate, action, sponname, sponop, sponcp, sponp, conname, conop, concp, 
>conp, partname,
> partop, partcp, partp, manname, manop, mancp, manp, dbaname, dbaop, dbacp, dbap, 
>engname, engop,

> engcp, engp, mainname, mainop, maincp, mainp, process, rollback, closeout, datetime, 
>purpose,
> risk, saname, saop, sacp, sap, total, pending, counting) values ('$owner', '@names', 
>'$maintype',
                                                                              ^^^^^^
                                                           You're sure that the email 
is an array
of names ?

> '$title', '$requested', '$engineer', '$ticket', '$impact', '$comm', '$dispo', '$d 
>ispodate',
> '$action', '$sponname', '$sponop', '$sponcp', '$sponp', '$conname', '$conop', 
>'$concp', '$conp',
> '$partnam e', '$partop', '$partcp', '$partp', '$manname', '$manop', '$mancp', 
>'$manp', '$dbaname',
> '$dbaop', '$dbacp', '$dbap',
>  '$engname', '$engop', '$engcp', '$engp', '$mainname', '$mainop', '$maincp', 
>'$mainp', '$process',
>  '$rollback', '$clo
> seout', '$datetime', '$purpose', '$risk', '$saname', '$saop', '$sacp', '$sap', 
>'$total',
> '$pending', '$counting')");
> 

And here's a little more beautiful form.

my @fields = qw(
    owner,    email,    maintype,  title,     requested, engineer,
    ticket,   impact,   comm,      dispo,     dispodate, action, 
    sponname, sponop,   sponcp,    sponp,     conname,   conop, 
    concp,    conp,     partname,  partop,    partcp,    partp, 
    manname,  manop,    mancp,     manp,      dbaname,   dbaop, 
    dbacp,    dbap,     engname,   engop,     engcp,     engp, 
    mainname, mainop,   maincp,    mainp,     process,   rollback, 
    closeout, datetime, purpose,   risk,      saname,    saop, 
    sacp,     sap,      total,     pending,   counting)
);

my @values = join "," => map {"'$_'"} (
   $owner,    "@names",  $maintype, $title,   $requested, $engineer, 
   $ticket,   $impact,   $comm,     $dispo,   $dispodate, $action, 
   $sponname, $sponop,   $sponcp,   $sponp,   $conname,   $conop, 
   $concp,    $conp,     $partname, $partop,  $partcp,    $partp, 
   $manname,  $manop,    $mancp,    $manp,    $dbaname,   $dbaop, 
   $dbacp,    $dbap,     $engname,  $engop,   $engcp,     $engp, 
   $mainname, $mainop,   $maincp,   $mainp,   $process,   $rollback, 
   $closeout, $datetime, $purpose,  $risk,    $saname,    $saop, 
   $sacp,     $sap,      $total,    $pending, $counting
);
$sth = $dbh->do "INSERT INTO Maintenance @fields VALUES (@values)";


Without the strange behaviour of email => @names you also would have written:

no strict 'refs';
my @values = join "," => map {"'${$_}'"} @fields;
use strict 'refs';

If any of your data contains a ' so you should quote it:

my @values = join "," => map {"'$_'"} map { $dbh->quote } @fields;


Best Wishes,
Janek


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to