2010-01-03 39 views
6

Có vẻ như không thể thực hiện được, nhưng tôi cũng có thể hỏi, tôi có thể sai. Đã tự hỏi nếu có anyway cho perl để cập nhật nhiều hàng bằng cách sử dụng một cuộc gọi MySQL, tôi đang sử dụng DBI.Perl: Cập nhật nhiều hàng với một cuộc gọi MySQL

Bất kỳ trợ giúp hoặc phản hồi nào sẽ được đánh giá rất nhiều, điều này có thể xảy ra trong MSSQL thông qua ASP và ASP.net vì vậy đã tự hỏi liệu cũng có thể thông qua perl trên MySQL hay không.

Cảm ơn bạn đã phản hồi!

+0

trong ví dụ của bạn, không có lý do gì để không kết hợp hai bản cập nhật thành một; bạn có thể đưa ra ví dụ giống như các bản cập nhật bạn thực sự cần phải làm không? – ysth

Trả lời

14

Đầu tiên và quan trọng nhất, bạn tuyệt đối không nên nội suy các biến trực tiếp vào chuỗi SQL của bạn. Điều đó để mở khả năng tấn công SQL injection. Ngay cả khi các biến đó không đến từ đầu vào của người dùng, nó vẫn mở khả năng 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 DBD MySQL hỗ trợ nhiều câu lệnh, mặc dù nó bị tắt theo mặc định là tính năng an toàn. Xem mysql_multi_statements trong phần Class Methods trong tài liệu DBD :: mysql.

Nhưng giải pháp tốt hơn, giải quyết 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ị và giá trị giữ chỗ.

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

Sau đó, nhận được dữ liệu của bạn trong một vòng lặp của 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ị báo cáo kết quả một lần, và các giá trị giữ chỗ được thay thế (và đảm bảo được trích dẫn đúng) bởi trình điều khiển DBD.

Đọc thêm về trình giữ chỗ trong DBI docs.

+3

"Trình điều khiển DBD" chỉ là trình điều khiển phụ trợ cụ thể được DBI sử dụng, chẳng hạn như DBD :: mysql. Tuy nhiên, bạn không cần quan tâm đến các kết nối - miễn là bạn tiếp tục sử dụng lại '$ dbh' để chạy các câu lệnh, bạn sẽ sử dụng cùng một kết nối cơ sở dữ liệu và 'chuẩn bị một lần, thực hiện nhiều mô hình được trình diễn bởi friedo sẽ hiệu quả hơn so với truyền nhiều truy vấn trong một chuỗi, vì nó tránh được việc phải phân tích (chuẩn bị) từng truy vấn riêng lẻ. –

+3

@mastermind: nội suy luôn xấu, bất kể ứng dụng là gì; nhiều lỗ hổng phát sinh từ lỗi lập trình viên hơn là sự tinh nghịch của người dùng. – Ether

3

Bạn không cần mysql_multi_statements, như Friedo gợi ý.

Bạn cần tắt chế độ Autocommit trước khi bạn gọi vòng lặp chứa lệnh UPDATE của bạn:

**$dbh->{AutoCommit} = 0;** 
while($condition) { 
    my $myParam = something(); 
    ... 
    $sth->execute($myParam); #your prepared UPDATE statement 
    ... 
} 
**$dbh->commit();** 
Các vấn đề liên quan