Po pierwsze i najważniejsze, absolutnie nie należy interpolować zmiennych bezpośrednio do łańcuchów SQL. To pozostawia otwartą możliwość ataków typu SQL injection. Nawet jeśli te zmienne nie pochodzą z danych wejściowych użytkownika, pozostawia to otwartą możliwość niebezpiecznych błędów, które mogą zepsuć twoje dane.
Sterownik MySQL DBD obsługuje wiele instrukcji, chociaż jest domyślnie wyłączony jako funkcja bezpieczeństwa. Zobacz mysql_multi_statements
pod Metody klas
w dokumentacji DBD::mysql.
Ale znacznie lepszym rozwiązaniem, które rozwiązuje oba problemy jednocześnie i jest bardziej przenośne, jest użycie przygotowanych instrukcji i wartości zastępczych.
my $sth = $dbh->prepare("UPDATE LOW_PRIORITY TableName SET E1=?,F1=? WHERE X=?");
Następnie umieść swoje dane w jakiejś pętli:
while( $whatever) {
my ( $EC, $MR, $EM ) = get_the_data();
$sth->execute( $EC, $MR, $EM );
}
Wystarczy przygotować instrukcję tylko raz, a wartości zastępcze są zastępowane (i gwarantowane, że są prawidłowo cytowane) przez sterownik DBD.
Przeczytaj więcej o symbolach zastępczych w dokumentacji DBI .