2012-01-25 4 views
8

Ho una tabella "evento". Per semplicità, puoi immaginare che dovrebbe essere come una categoria gerarchica. Esso utilizza il nidificato modello di set (Grazie a Mark Hillyer per il suo posto a http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)Esecuzione di più query in codeigniter che non possono essere eseguite una per una

Il mio codice:

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

E dopo che ho intenzione di aggiornare l'ultimo oggetto inserito con $this->db->update('event', $data)

$data è una matrice che l'utente ha riempito.


Problema 1:

non ho potuto eseguire $ query con $ this-> db-> query ($ query);;

Soluzione 1 che non ha funzionato:

I. Usa mysqli motore db.

II. mysqli_multi_query($this->db->conn_id, $query); Mentre ho pensato che funziona, sta dando il seguente errore:

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


Problema 2:

$this->db->insert_id() non funziona (restituisce 0)

Problema 3:

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


Come posso correggere questo codice per funzionare? Sarei persino felice di trovare una soluzione per il primo problema.

+0

Si potrebbe avere una serie di domande singole ed eseguirli in un ciclo – GordonM

+0

No, come si può vedere in questo caso l'esecuzione di query separate non funziona, perché non riesco a ricordare I risultati di '@ myRight' e' @ Level' dei risultati delle query precedenti –

+0

Le variabili non vengono conservate fino alla disconnessione? – GordonM

risposta

12

Forse utilizzare le transazioni?

$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

Grazie. Non sono in una situazione per testare la tua risposta ora. Ad ogni modo, dato che sembra essere il giusto, e senza problemi, lo accetto fino a quando non controllo veramente come funziona. –

2

Perché non scrivere semplicemente una procedura memorizzata che fa tutto l'SQL che hai elencato sopra prendendo le variabili nelle tue query come parametri. Quindi chiama la stored procedure come una singola istruzione SQL;

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

Le variabili definite dall'utente in MySQL sono specifiche della connessione e vengono mantenute fino alla chiusura della connessione.

$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

Aggiungo che devi assicurarti che la riga dbdriver in 'system/application/config/database.php' sia impostata su' mysqli': '$ db ['default'] ['dbdriver'] =" mysqli ";' Questo post è esattamente ciò di cui avevo bisogno per velocizzare il mio inserimento di massa. Grazie mille. –

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

puoi per favore formattare le domande? – WhatsThePoint