Đầu tiên và quan trọng nhất, bạn tuyệt đối không nên nội suy biến trực tiếp vào chuỗi SQL của mình. Điều đó để lại khả năng xảy ra các cuộc tấn công SQL injection. Ngay cả khi các biến đó không đến từ thông tin người dùng nhập, nó vẫn để lại khả năng xuất hiện các lỗi nguy hiểm có thể làm hỏng dữ liệu của bạn.
Trình điều khiển MySQL DBD hỗ trợ nhiều câu lệnh, mặc dù nó bị tắt theo mặc định như một tính năng an toàn. Xem mysql_multi_statements
theo Phương thức lớp
trong tài liệu DBD ::mysql.
Nhưng một giải pháp tốt hơn nhiều, giải quyết được cả hai vấn đề cùng một lúc và dễ di chuyển hơn, là sử dụng các câu lệnh đã chuẩn bị sẵn và các giá trị trình giữ chỗ.
my $sth = $dbh->prepare("UPDATE LOW_PRIORITY TableName SET E1=?,F1=? WHERE X=?");
Sau đó, lấy dữ liệu của bạn theo một số loại:
while( $whatever) {
my ( $EC, $MR, $EM ) = get_the_data();
$sth->execute( $EC, $MR, $EM );
}
Bạn chỉ cần chuẩn bị câu lệnh một lần và các giá trị trình giữ chỗ được thay thế (và đảm bảo được trích dẫn chính xác) bằng trình điều khiển DBD.
Đọc thêm về trình giữ chỗ trong tài liệu DBI .