Php codeigniter插入语法错误
这是我的insert sql语句:Php codeigniter插入语法错误,php,mysql,codeigniter,activerecord,Php,Mysql,Codeigniter,Activerecord,这是我的insert sql语句: $sql = " LOCK TABLE notre_offre WRITE; SELECT @myRight := rgt FROM notre_offre WHERE id = " . $this->input->post('category') . "; UPDATE no
$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中非常有效。
“不知道Codeigniter的具体情况,但您可能无法一次发送多个SQL命令。请尝试使用单独的
查询()发送单个锁,选择等命令
调用。您可能需要对此进行调整,但应该从以下几方面着手,在数据库中创建存储过程,而不是每次都尝试动态查询:
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 ;
请注意,您只需定义一次,而不是每次插入节点时。因此,您可以从您最喜欢的DB GUI工具(如phpMyAdmin、MySQL Workbench等)运行它。之后,要插入节点,而不是尝试将其直接插入表中,您可以这样调用它:
CALL `InsertNode`('Televisions', 'Game Consoles', 'User-defined Title');
不过,正如我所说,根据表中的确切字段,您可能需要添加参数并调整上面的过程,以使其完全按照您的要求工作。不过,这应该是一个良好的开端。除了下面Wolfgang的评论之外,我还要补充一点,从您尝试执行的操作的外观来看,您确实需要将其设置为一个存储过程,或者获取第一个查询的结果并使用它来构造后面的查询。此外,我认为您需要将其放入事务中,而不是使用手动表锁定。我知道这是不推荐使用的,但我正在从中学习。请给我一个存储过程的示例,或者提供一些链接,以便我可以了解更多信息是吗?当然,我会尝试在下面的答案中总结一些东西,但这需要几分钟的时间。顺便说一下,这是一篇很棒的文章;我不知道为什么现在很难找到。是的,很神奇,这篇文章不再是官方的,这是一份副本:)非常感谢你