2012-01-25 28 views
8

Tôi có bảng "sự kiện". Để đơn giản, bạn có thể tưởng tượng rằng nó phải giống như một danh mục phân cấp phân cấp. Nó sử dụng lồng nhau đặt mô hình (Cảm ơn Mark Hillyer cho bài của mình tại http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)Thực hiện nhiều truy vấn trong trình mã hóa mà không thể thực hiện từng cái một

Mã của tôi:

$query = 
"LOCK TABLE event WRITE; 
SELECT @ParentRight := parent.rgt, @Level := parent.level FROM event AS parent WHERE parent.id = '{$data['parent_id']}'; 

UPDATE event SET rgt = rgt + 2 WHERE rgt > @ParentRight; 
UPDATE event SET lft = lft + 2 WHERE lft > @ParentRight; 

INSERT INTO event(lft, rgt, level) VALUES(@ParentRight, @ParentRight + 1, @Level); 
UNLOCK TABLES;"; 

mysqli_multi_query($this->db->conn_id, $query); 

$data['id'] = $this->db->insert_id(); 
return $this->db->update('event', $data); 

Và sau đó tôi sẽ cập nhật các đối tượng chèn ngoái với $this->db->update('event', $data)

$data là một mảng mà người dùng đã điền.


Vấn đề 1:

tôi không thể thực hiện $ query với $ this-> db-> query ($ query);;

Giải pháp 1 mà không làm việc:

I. Sử dụng mysqli động cơ db.

II. mysqli_multi_query($this->db->conn_id, $query); Trong khi tôi nghĩ nó hoạt động, nó được đưa ra các lỗi sau:

Commands out of sync; you can’t run this command now.


Vấn đề 2:

$this->db->insert_id() không hoạt động (trả về 0)

Vấn đề 3:

$this->db->update('event', $data); lỗi: Commands out of sync; you can't run this command now


Tôi làm cách nào để sửa mã này hoạt động? Tôi rất vui khi tìm được giải pháp cho vấn đề đầu tiên.

+0

Bạn có thể có một loạt các truy vấn đơn và thực hiện chúng trong một vòng lặp – GordonM

+0

Không, như bạn thấy trong trường hợp này thực hiện như các truy vấn riêng biệt không hoạt động bởi vì nó không thể thu hồi '@ myRight' và' @ Level' vars từ kết quả truy vấn trong quá khứ ' –

+0

Biến không được bảo tồn cho đến khi bạn ngắt kết nối? – GordonM

Trả lời

12

Có thể sử dụng giao dịch?

$this->db->trans_start(); 
$this->db->query('AN SQL QUERY...'); 
$this->db->query('ANOTHER QUERY...'); 
$this->db->query('AND YET ANOTHER QUERY...'); 
$this->db->trans_complete(); 

http://ellislab.com/codeigniter/user-guide/database/transactions.html

+0

Cảm ơn bạn. Tôi không ở trong tình huống để kiểm tra câu trả lời của bạn ngay bây giờ. Dù sao vì nó có vẻ là quyền, và rắc rối-miễn phí, tôi chấp nhận nó cho đến khi tôi thực sự kiểm tra nó hoạt động như thế nào. –

2

Tại sao không chỉ viết một thủ tục được lưu trữ thực hiện tất cả các câu lệnh SQL mà bạn liệt kê ở trên, lấy các biến trong truy vấn của bạn làm tham số. Sau đó, chỉ cần gọi thủ tục đã lưu trữ như là một câu lệnh SQL duy nhất;

$sql = "CALL some_sp($param1, $param2...etc)"; 
2

Biến do người dùng định nghĩa trong MySQL là kết nối cụ thể và được giữ cho đến khi bạn đóng kết nối.

$queryList = array(
    "LOCK TABLE event WRITE", 
    "SELECT @ParentRight := parent.rgt, @Level := parent.level FROM event AS parent WHERE parent.id = '{$data['parent_id']}'", 
    "UPDATE event SET rgt = rgt + 2 WHERE rgt > @ParentRight", 
    "UPDATE event SET lft = lft + 2 WHERE lft > @ParentRight", 
    "INSERT INTO event(lft, rgt, level) VALUES(@ParentRight, @ParentRight + 1, @Level)", 
    false, // special value 
    "UNLOCK TABLES", 
) 

foreach ($queryList as $query) if ($query) { 
    mysqli_query($this->db->conn_id, $query); 
    // you should have error-checking here 
} else { 
    // we have the special value 
    $data['id'] = $this->db->insert_id(); 
} 
+0

Tôi sẽ thêm rằng bạn phải đảm bảo dòng dbdriver trong 'system/application/config/database.php' được đặt thành' mysqli': '$ db ['default'] ['dbdriver'] =" mysqli ";' Bài đăng này chính xác là những gì tôi cần để tăng tốc độ chèn hàng loạt của mình. Cảm ơn nhiều. –

0
$query1 = $this->db->query("SELECT * FROM `Wo_Products` WHERE `boost_plan`=1 AND `tamatar`=1 AND`active`=1 ORDER BY rand() LIMIT 3"); 

$query2 = $this->db->query("SELECT * FROM `Wo_Products` WHERE `boost_plan`=2 AND `tamatar`=1 AND`active`=1 ORDER BY rand() LIMIT 3"); 

$query3 = $this->db->query("SELECT * FROM `Wo_Products` WHERE `boost_plan` NOT IN (0,1) AND `tamatar`=1 AND`active`=1 ORDER BY rand() LIMIT 6"); 

    $result1 = $query1->result(); 
    $result2 = $query2->result(); 
    $result3 = $query3->result(); 
    return array_merge($result1, $result2, $result3); 
+0

bạn có thể định dạng các truy vấn không? – WhatsThePoint

Các vấn đề liên quan