2012-01-25 29 views
8

Bir "olay" tablosum var. Basitlik için, hiyerarşik kategori gibi olması gerektiğini hayal edebilirsiniz. O (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ görevinden Mark Hillyer sayesinde) iç içe kümesi modeli kullanırTek tek yürütülemeyen kod işaretleyicide birden çok sorgu yürütme

Kodum:

$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); 

Ondan sonra $this->db->update('event', $data)

son eklenen nesneyi güncellemek için gidiyorum

$data, kullanıcının doldurduğu bir dizidir.


Sorun 1:

Ben $ sorguyu yürütmek olamazdı $ this-> db-> query ($ sorgu) ile;; işe yaramadı

Çözüm 1:

I. Kullanım mysqli db motoru.

II.

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


Sorun 2: mysqli_multi_query($this->db->conn_id, $query); buna aşağıdaki hatayı veriyor, işleri düşünce iken

$this->db->insert_id() çalışmıyor (döner 0)

Sorun 3:

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


Çalışmak için bu kodu nasıl düzeltebilirim? İlk problem için bir çözüm bulmaktan bile memnun olurum.

+0

Sen tek sorgular bir dizi var ve ayrı sorgular gibi yürütme çalışmıyor bu durumda görebileceğiniz gibi, bir döngü – GordonM

+0

Hayır bunları yürütebilir o hatırlama olamaz çünkü '@ myRight' ve' Level' geçmiş sorguların sonuçlarından farklılık gösteriyor –

+0

Bağlantıları kesene kadar değişkenler korunmuyor mu? – GordonM

cevap

12

Belki işlemleri kullanın?

$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

Teşekkür ederim. Cevabınızı şimdi test etmek için bir durumda değilim. Her neyse, haklı ve sorunsuz bir şekilde göründüğü gibi, gerçekten nasıl çalıştığını kontrol edene kadar kabul ediyorum. –

2

Neden yukarıda listelenen tüm SQL'i sorgularınızdaki değişkenleri parametre olarak alarak saklı bir yordam yazmayın. Ardından, saklı yordamı tek bir SQL ifadesi olarak adlandırın;

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

MySQL'deki kullanıcı tanımlı değişkenler bağlantıya özeldir ve siz bağlantıyı kapatana kadar korunur.

$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

Sistem/uygulama/config/database.php' içindeki dbdriver satırının 'mysqli' olarak ayarlandığından emin olmanız gerektiğini ekleyeceğim: ' $ db ['default'] ['dbdriver'] = "mysqli ";" Bu yazı, toplu eklentimi hızlandırmak için ihtiyacım olan şey. Çok teşekkür ederim. –

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

Sorguları biçimlendirebilir misiniz? – WhatsThePoint

İlgili konular