2012-01-25 13 views
8

द्वारा निष्पादित नहीं किया जा सकता है मेरे पास "ईवेंट" तालिका है। सादगी के लिए, आप कल्पना कर सकते हैं कि यह पदानुक्रमित श्रेणी जैसा होना चाहिए। यह (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ अपने पद के लिए मार्क हिलियर के लिए धन्यवाद) नेस्टेड सेट मॉडल का उपयोग करताकोडनिर्देशक में एकाधिक प्रश्नों को निष्पादित करना जिसे एक

मेरे कोड:

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

और उसके बाद मैं $this->db->update('event', $data)

के साथ पिछले डाला वस्तु को अद्यतन करने के लिए जा रहा हूँ

$data एक सरणी है जिसे उपयोगकर्ता ने भर दिया है।


समस्या 1:

मैं $ क्वेरी निष्पादित नहीं कर सकासाथ $ this-> db-> क्वेरी ($ क्वेरी);;

समाधान 1 बात नहीं बनी:

मैं उपयोग mysqli db इंजन।

II। mysqli_multi_query($this->db->conn_id, $query); जबकि मैंने सोचा कि यह काम करता है, यह निम्न त्रुटि दे रहा है:

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


समस्या 2:

$this->db->insert_id() काम नहीं करता है (रिटर्न 0)

समस्या 3:

$this->db->update('event', $data); त्रुटियां: Commands out of sync; you can't run this command now


मैं इस कोड को काम करने के लिए कैसे सही कर सकता हूं? मुझे पहली समस्या का हल ढूंढने में भी खुशी होगी।

+0

आप एकल प्रश्नों की एक सरणी है और उन्हें एक पाश – GordonM

+0

नहीं में निष्पादित, जैसा कि आप इस मामले में देख सकते हैं अलग-अलग क्वेरी के रूप में क्रियान्वित करने से काम नहीं करता सका, क्योंकि यह याद नहीं आ रहा पिछले प्रश्नों से '@ myRight' और' @ Level' vars 'परिणाम –

+0

क्या वे डिस्कनेक्ट होने तक चर संरक्षित नहीं हैं? – GordonM

उत्तर

12

शायद लेनदेन का उपयोग करें?

$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

धन्यवाद। मैं अब आपके जवाब का परीक्षण करने की स्थिति में नहीं हूं। वैसे भी जैसा कि यह सही लगता है, और परेशानी मुक्त है, मैं इसे तब तक स्वीकार करता हूं जब तक कि मैं वास्तव में जांच नहीं करता कि यह कैसे काम करता है। –

2

क्यों न केवल एक संग्रहीत प्रक्रिया लिखें जो आपके द्वारा सूचीबद्ध सभी एसक्यूएल को पैरामीटर के रूप में आपके प्रश्नों में चर लेते हैं। फिर बस संग्रहीत प्रक्रिया को एक एकल SQL कथन के रूप में कॉल करें;

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

MySQL में उपयोगकर्ता परिभाषित चर कनेक्शन-विशिष्ट हैं और जब तक आप कनेक्शन बंद नहीं करते हैं तब तक रखा जाता है।

$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

मैं जोड़ूंगा कि आपको यह सुनिश्चित करना होगा कि 'system/application/config/database.php' में dbdriver लाइन' mysqli' पर सेट है: '$ db ['default'] ['dbdriver'] =" mysqli "; 'यह पोस्ट वही है जो मुझे अपने थोक सम्मिलन को तेज करने के लिए आवश्यक था। आपका बहुत बहुत धन्यवाद। –

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

क्या आप प्रश्नों को प्रारूपित कर सकते हैं? – WhatsThePoint