【问题标题】:Insert and Delete multi queries in CodeIgniter在 CodeIgniter 中插入和删除多个查询
【发布时间】:2012-07-30 04:44:22
【问题描述】:

我有以下查询用于从前序遍历数据库中插入和删除记录。我正在使用 codeigniter 并且不知道如何在其中触发多个查询。我尝试了以下查询,但没有在 codeigniter 中正确触发并使用 phpmyadmin 正确触发。

向数据库插入记录查询:

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

以上查询有什么问题?

【问题讨论】:

  • 您没有在“以下代码有什么问题”之后发布任何代码。...

标签: php mysql codeigniter mysqli


【解决方案1】:

提供批量更新和插入功能 - 见下文

$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->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 使用

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

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

参考:http://codeigniter.com/user_guide/database/active_record.html

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

【讨论】:

    【解决方案2】:

    除了潜在的 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');
    

    等等..(查看文档)

    【讨论】:

      【解决方案3】:

      已使用的批量更新和插入功能可用。 codeigniter 的使用指南将为您提供帮助。试试下面的链接:

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

      【讨论】:

        猜你喜欢
        • 2015-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多