2012-12-28 210 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