Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Perl:atualize várias linhas com uma chamada MySQL


Primeiro e mais importante, você absolutamente não deve interpolar variáveis ​​diretamente em suas strings SQL. Isso deixa em aberto a possibilidade de ataques de injeção de SQL. Mesmo que essas variáveis ​​não venham da entrada do usuário, isso deixa em aberto a possibilidade de bugs perigosos que podem estragar seus dados.

O driver MySQL DBD suporta várias instruções, embora esteja desativado por padrão como um recurso de segurança. Veja mysql_multi_statements sob os Métodos de classe seção na documentação DBD::mysql.

Mas uma solução muito melhor, que resolve os dois problemas ao mesmo tempo e é mais portátil, é usar instruções preparadas e valores de espaço reservado.
my $sth = $dbh->prepare("UPDATE LOW_PRIORITY TableName SET E1=?,F1=? WHERE X=?");

Em seguida, coloque seus dados em um loop de algum tipo:
while( $whatever) { 
    my ( $EC, $MR, $EM ) = get_the_data();
    $sth->execute( $EC, $MR, $EM );
}

Você só precisa preparar a instrução uma vez e os valores de espaço reservado são substituídos (e garantidos para serem citados corretamente) pelo driver DBD.

Leia mais sobre marcadores de posição nos documentos DBI .