【问题标题】:codeigniter insert into syntax errorcodeigniter 插入语法错误
【发布时间】:2012-12-28 23:17:19
【问题描述】:

这是我的插入 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 完美运行。 "

【问题讨论】:

  • 连同 Wolfgang 在下面的评论,我想补充一点,从你想要做的事情来看,你真的需要把它变成一个存储过程,或者获取第一个的结果查询并使用它来构造后面的查询。另外,我认为您需要将其放入事务中,而不是使用手动表锁定。
  • 我知道这已被弃用,但我正在从 web.archive.org/web/20051023020223/http://dev.mysql.com/… 中学习
  • 当然,我会尝试在下面的答案中汇总一些内容,但这需要几分钟。顺便说一句,那是一篇很棒的文章;不知道为什么现在这么难找。
  • 是的,太棒了,这篇文章已经不在官方了,这是一个副本:) 非常感谢你

标签: php mysql codeigniter activerecord


【解决方案1】:

不具体了解 Codeigniter,但您可能一次无法发送多个 SQL 命令。尝试通过单独的 query() 调用发送单独的 LOCKSELECT 等命令。

【讨论】:

    【解决方案2】:

    您可能需要对此进行调整,但这些方面的内容应该可以帮助您开始在数据库中创建存储过程,而不是每次都尝试在运行中查询它:

    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 工具(例如 PhpMyAdmit、MySQL Workbench 等)运行它。之后,插入一个节点,而不是尝试将其直接插入到表中,您可以这样调用它:

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

    不过,就像我说的那样,根据表中的确切字段,您可能需要添加参数并调整上述过程以完全按照您的要求工作。不过,这应该是一个好的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多