Mysql
 sql >> Base de données >  >> RDS >> Mysql

Perl :mettre à jour plusieurs lignes avec un seul appel MySQL

Tout d'abord et le plus important, vous ne devez absolument pas interpoler les variables directement dans vos chaînes SQL. Cela laisse ouverte la possibilité d'attaques par injection SQL. Même si ces variables ne proviennent pas de l'entrée de l'utilisateur, cela laisse ouverte la possibilité de bogues dangereux qui peuvent gâcher vos données.

Le pilote MySQL DBD prend en charge plusieurs instructions, bien qu'il soit désactivé par défaut par mesure de sécurité. Voir mysql_multi_statements sous les méthodes de classe dans la documentation DBD::mysql.

Mais une bien meilleure solution, qui résout les deux problèmes à la fois et est plus portable, consiste à utiliser des instructions préparées et des valeurs d'espace réservé.

my $sth = $dbh->prepare("UPDATE LOW_PRIORITY TableName SET E1=?,F1=? WHERE X=?");

Ensuite, placez vos données dans une sorte de boucle :

while( $whatever) { 
    my ( $EC, $MR, $EM ) = get_the_data();
    $sth->execute( $EC, $MR, $EM );
}

Vous n'avez besoin de préparer la déclaration qu'une seule fois, et les valeurs d'espace réservé sont remplacées (et garanties d'être correctement citées) par le pilote DBD.

En savoir plus sur les espaces réservés dans les documents DBI .