0

予約注文トラバーサル データベースからレコードを挿入および削除するための次のクエリがあります。私は 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);

上記のクエリの何が問題になっていますか?

4

3 に答える 3

0

使用されるバッチ更新および挿入機能が利用可能です。codeigniter の使用済みガイドが役立ちます。次のリンクを試してください。

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

于 2012-08-07T10:17:04.950 に答える
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');

など..(ドキュメントを見てください)

于 2012-07-30T05:02:26.140 に答える
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->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

于 2012-07-30T07:31:45.347 に答える