Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php codeigniter插入语法错误_Php_Mysql_Codeigniter_Activerecord - Fatal编程技术网

Php codeigniter插入语法错误

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

这是我的insert 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中非常有效。

不知道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的评论之外,我还要补充一点,从您尝试执行的操作的外观来看,您确实需要将其设置为一个存储过程,或者获取第一个查询的结果并使用它来构造后面的查询。此外,我认为您需要将其放入事务中,而不是使用手动表锁定。我知道这是不推荐使用的,但我正在从中学习。请给我一个存储过程的示例,或者提供一些链接,以便我可以了解更多信息是吗?当然,我会尝试在下面的答案中总结一些东西,但这需要几分钟的时间。顺便说一下,这是一篇很棒的文章;我不知道为什么现在很难找到。是的,很神奇,这篇文章不再是官方的,这是一份副本:)非常感谢你