Đây dường như là một hạn chế của chính PHP, hãy xem bài đăng này trên diễn đàn Wordpress .
Tôi đã phải đối mặt với cùng một vấn đề và cuối cùng đã tạo một hàm tùy chỉnh để thực hiện công việc, tôi dán nó vào đây trong trường hợp nó hữu ích cho ai đó. Chức năng này khá đơn giản vì nó thực hiện một số giả định, nhưng sẽ dễ dàng sửa đổi nó để phù hợp với các nhu cầu khác nhau. Cụ thể, nó giả định rằng:
- Tất cả các câu lệnh đều là bản chèn và bản cập nhật, không có dữ liệu nào để trả về.
- Các câu lệnh được phân tách bằng một chuỗi cuối dòng.
- Các câu lệnh được đính kèm trong một giao dịch.
Đây là chức năng:
function execute_multiline_sql($sql) {
global $wpdb;
$sqlParts = array_filter(explode("\r\n", $sql));
foreach($sqlParts as $part) {
$wpdb->query($part);
if($wpdb->last_error != '') {
$error = new WP_Error("dberror", __("Database query error"), $wpdb->last_error);
$wpdb->query("rollback;");
return $error;
}
}
return true;
}
Ví dụ sử dụng:
$sql = "start transaction;\r\n" .
"insert into ...;\r\n" .
"update ...;\r\n" .
"commit;\r\n"
;
$result = execute_multiline_sql($sql);
if(is_wp_error($result)) {
//Fail!
}