Tôi chỉ nhận thấy rằng @Berdir thật tuyệt khi xóa db_affected_rows
khỏi Drupal 7 . Bây giờ tôi đang tự hỏi thực tiễn tốt nhất bây giờ là gì để phát hiện nếu truy vấn bạn chạy đã thay đổi bất cứ điều gì trong cơ sở dữ liệu.
Một usecase điển hình sẽ là.
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
Tôi đã xem xét đối tượng truy vấn được trả về từ db_query, nhưng có vẻ như nó không giúp ích nhiều.
Cập nhật:
Tôi thấy tôi đã không rõ ràng về những trường hợp tôi cần thông tin.
Trường hợp sử dụng hiện tại của tôi, là một khá đơn giản. Tôi có một bảng cho một loại nút với một cột nid và một số cột dữ liệu. Tôi có một biểu mẫu khi gửi biểu mẫu, tôi muốn chèn hoặc cập nhật hàng trong db.
Vấn đề với db_update
/ db_insert
là, nếu tôi sử dụng cập nhật trước và chèn nếu cập nhật trả về 0, tôi sẽ không nắm bắt được điều kiện, trong đó biểu mẫu được gửi với giá trị trong db. Nếu tôi sử dụng db_insert trước, điều đó sẽ gây ra lỗi nếu có một hàng trong db.
Tôi cho rằng tôi trong điều kiện cụ thể này có thể chèn một giá trị trống khi nút được tạo và sau đó chỉ sử dụng cập nhật, nhưng đối với một số trường hợp có thể không thực hiện được, nếu tôi cần lưu trữ thông tin được khóa vào cơ sở dữ liệu bên ngoài. Tôi cũng muốn tránh phải phụ thuộc vào các giá trị cơ sở dữ liệu để mã của tôi hoạt động.
Chiến lược thông thường của tôi cho những trường hợp như vậy, đã được thực hiện
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
Làm điều này vừa đơn giản vừa không có lỗi cho dù db đang ở tình trạng nào. Tùy chọn tốt nhất tôi có thể thấy ngay bây giờ, sẽ là xử lý nó bằng SQL và thực hiện điều này:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
Nhưng tôi đã hy vọng rằng API db sẽ có thể xử lý việc này.