2012-07-30 4 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

Вы не отправил любой код следующий ваш «Что случилось с следующий код» ... –

+0

жаль ... Я редактировал – Sky

ответ

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

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

Существует также $ this-> db- > доступна функция запроса() $this->db->query('YOUR QUERY HERE');

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

// Update

$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 использовать

$this->input->get(NULL, TRUE); // returns all GET items with XSS filter 

или

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

Ref: http://codeigniter.com/user_guide/database/active_record.html

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

Смежные вопросы