2012-12-28 236 views
1

這是我插入SQL語句:笨插入語法錯誤

$sql = " 
       LOCK TABLE notre_offre WRITE; 

       SELECT 
        @myRight := rgt FROM notre_offre 
       WHERE id = " . $this->input->post('category') . "; 

       UPDATE notre_offre SET rgt = rgt + 2 WHERE rgt > @myRight; 
       UPDATE notre_offre SET lft = lft + 2 WHERE lft > @myRight; 
       INSERT INTO notre_offre(id, naziv, lft, rgt) VALUES(null, '" . $this->input->post('title') . "', @myRight + 1, @myRight + 2); 
       UNLOCK TABLES; 
       "; 

     $query = $this->db->query($sql); 

但我有語法錯誤:

"Error Number: 1064 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @myRight := rgt FROM notre_offre WHERE id = 2; UPD' at line 3 

這裏有什麼問題嗎?這從phpmyadmin和cmd完美工作。 「

+0

隨着Wolfgang的評論下面,我會補充說,看起來你想做什麼,你真的需要將它做成一個存儲過程,否則獲取第一個查詢的結果並將其用於構建後面的查詢。另外,我認爲你需要把它放在一個事務中,而不是使用手動表鎖定。 –

+0

我知道這是不贊成的,但我從這個http://web.archive.org/web/20051023020223/http://dev.mysql.com/tech-resources/articles/hierarchical-data.html可以學習給我舉例這個存儲過程,或者可以給我一些鏈接,我可以瞭解更多關於它? – Bumblebee989

+0

當然,我會盡量在下面的答案中加入一些東西,但這需要幾分鐘的時間。順便說一下,這是一篇很棒的文章;我不知道爲什麼現在很難找到。 –

回答

2

不知道笨特別,但你可能無法在一個去發送多條SQL命令。試着發送個人LOCKSELECT等具有獨立query()調用命令。

1

你可能必須調整這一點,但這些方針的東西應該讓你開始在你的數據庫中創建一個存儲過程,而不是試圖每次查詢它的飛行:

DROP PROCEDURE IF EXISTS `InsertNode`; 
DELIMITER $$ 
CREATE DEFINER=`db_user`@`localhost` PROCEDURE `InsertNode` (
    pParentCategory VARCHAR(50), 
    pCategory VARCHAR(50), 
    pTitle VARCHAR(50) 
) 
    COMMENT 'Inserts a node into a hierarchical table' 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    SQL SECURITY DEFINER 
BEGIN 
    DECLARE myRight INTEGER; 

    START TRANSACTION; 
    SELECT `rgt` INTO myRight 
     FROM `notre_offre` 
     WHERE `id` = pParentCategory; 

    UPDATE `notre_offre` SET `rgt` = `rgt` + 2 WHERE `rgt` > myRight; 
    UPDATE `notre_offre` SET `lft` = `lft` + 2 WHERE `lft` > myRight; 
    INSERT INTO `notre_offre` (`id`, `naziv`, `lft`, `rgt`) 
     VALUES (pCategory, pTitle, myRight + 1, myRight + 2); 

    SELECT `pCategory` AS "id", pTitle as "myRight", 
     (myRight + 1) AS "lft", (myRight + 2) AS "rgt"; 
    COMMIT; 
END $$ 
DELIMITER ; 

請注意,您只需要定義這個一旦,不是每次你想插入一個節點。因此,您可以從您最喜歡的數據庫GUI工具(如PhpMyAdmit,MySQL Workbench等)運行它。之後,要插入節點,而不是嘗試將其直接插入表中,則可以這樣調用它:

CALL `InsertNode`('Televisions', 'Game Consoles', 'User-defined Title'); 

就像我說過的,儘管取決於表格中的確切字段,但您可能需要添加參數並調整上述過程以按照您的要求工作。不過,這應該是一個好的開始。

+0

非常感謝!對不起,我遲到的答案:) – Bumblebee989