2012-07-30 68 views
0

我有以下查詢插入和刪除預先遍歷數據庫中的記錄。我正在使用codeigniter,並不知道如何在其中激發多個查詢。我嘗試了下面的查詢,但沒有在codeigniter中正確觸發並使用phpmyadmin正確啓動。插入和刪除CodeIgniter中的多個查詢

查詢插入記錄到數據庫:

$level = $_GET['level'] + 1; 
$rgt = $_GET['rgt'] + 1; 
if ($_GET['level'] == 0) { 
    $sql = "UPDATE xp_subunit SET lft = lft+2, rgt=rgt+2 WHERE rgt > " . $_GET['rgt'] . "; "; 
    $sql .="INSERT INTO xp_subunit SET level=" . $level . ", lft =" . $_GET['rgt'] . ", rgt = " . $rgt . " , name = '" . $_GET['name'] . "', unit_id='" . $_GET['unit_id'] . "', description='" . $_GET['description'] . "';"; 
    echo $sql; 
} else { 
    $sql = "UPDATE xp_subunit SET rgt = rgt+2 WHERE rgt > " . $_GET['lft'] . "; "; 
    $sql .="INSERT INTO xp_subunit SET level=" . $level . ", lft =" . $_GET['rgt'] . ", rgt = " . $rgt . " , name = '" . $_GET['name'] . "', unit_id='" . $_GET['unit_id'] . "', description='" . $_GET['description'] . "';"; 
    echo $sql; 
} 
echo $query = $this->db->insert($this->tablename, $sql); 

查詢從數據庫中刪除記錄:

$sql .= "SELECT @myLeft := " . $_GET['lft'] . ", @myRight := " . $_GET['rgt'] . ", @myWidth := " . $_GET['lft'] . " - lft + 1 
    FROM xp_subunit WHERE id =" . $_GET['id'] . "; "; 
$sql .= "DELETE FROM xp_subunit WHERE lft BETWEEN @myLeft AND @myRight; "; 
$sql .= "UPDATE xp_subunit SET rgt = rgt - @myWidth WHERE rgt > @myRight; "; 
$sql .= "UPDATE xp_subunit SET lft = lft - @myWidth WHERE lft > @myRight; "; 
echo $query = $this->db->mysqli_multi_query($sql); 

哪些錯誤與上述疑問?

+0

您還沒有發佈以下你。「哪些錯誤與下面的代碼」 ...... – 2012-07-30 04:46:56

+0

對不起...我編輯它 – Sky 2012-07-30 04:48:33

回答

0

除了可能的sql注入($ _GET ['...']),在第一個查詢中使用$ this-> db-> insert()。這是因爲insert()是ActiveRecord庫的一部分,並且用於構造查詢,而不是執行它們。

至於爲什麼mysqli_multi_query失敗,我不知道。但是,我建議不要使用任何驅動程序特定的函數,因爲Code-Igniter允許您從數據庫中進行抽象。所以你應該使用$this->db->query()分別執行每個查詢。我們強烈建議您使用ActiveRecord。它允許您編寫查詢,而不必擔心數據庫之間的小語法差異。此外,它自動逃脫輸入。

編輯

第一個更新的查詢是:

$this->db->set('lft', 'lft+2', false); 
$this->db->set('rgt', 'rgt+2', false); 
$this->db->where('rgt >', $_GET['rgt']); 
$this->db->update('xp_subunit'); 

第一插入:

$this->db->set('level', $level); 
$this->db->set('lft', $_GET['rgt']); 
... 
$this->db->insert('xp_subunit'); 

等..(看看文件)

+0

感謝任何代碼....能否請您我怎麼能使用ActiveRecord – Sky 2012-07-30 05:12:10

0

有批量更新和插入可用功能 - 見下

$data = array(
    array(
     'title' => 'My title' ,'name' => 'My Name 2' , 'date' => 'My date 2' 
    ), 
    array(
     'title' => 'Another title' ,'name' => 'Another Name 2' , 'date' => 'Another date 2' 
    ) 
); 

$this->db->update_batch('mytable', $data, 'title'); 

// Produces: 
// UPDATE `mytable` SET `name` = CASE 
// WHEN `title` = 'My title' THEN 'My Name 2' 
// WHEN `title` = 'Another title' THEN 'Another Name 2' 
// ELSE `name` END, 
// `date` = CASE 
// WHEN `title` = 'My title' THEN 'My date 2' 
// WHEN `title` = 'Another title' THEN 'Another date 2' 
// ELSE `date` END 
// WHERE `title` IN ('My title','Another title') 

對於插入

$this->db->insert_batch('mytable', $data); 

還有$這個 - > DB- > query()函數可用$this->db->query('YOUR QUERY HERE');

To Update and Insert - You'll need to execute them separately 

//更新

$data = array(
       'title' => $title,'name' => $name,'date' => $date); 

$this->db->where('id', $id); 
$this->db->update('mytable', $data); 

//插入

$data = array(
    'title' => 'My title' ,'name' => 'My Name' ,'date' => 'My date'); 
$this->db->insert('mytable', $data); 

//刪除

$this->db->delete('mytable', array('id' => $id)); 

注意

而不是使用$ _GET使用

0123的

$this->input->get('some_data', TRUE); 

編號:http://codeigniter.com/user_guide/database/active_record.html

http://codeigniter.com/user_guide/libraries/input.html