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から完全に機能します。「」

4

2 に答える 2

2

Codeigniterについて具体的にはわかりませんが、一度に複数のSQLコマンドを送信することはおそらくできません。個別の呼び出しで個々LOCKSELECTコマンドなどを送信してみてください。query()

于 2012-12-28T23:19:24.827 に答える
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 ;

ノードを挿入するたびに定義する必要はなく、一度だけ定義する必要があることに注意してください。そのため、PhpMyAdmit、MySQL Workbench などのお気に入りの DB GUI ツールから実行できます。その後、ノードを挿入するには、テーブルに直接挿入するのではなく、次のように呼び出します。

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

ただし、前述のように、テーブル内の正確なフィールドによっては、パラメーターを追加し、上記の手順を微調整して、希望どおりに機能させる必要がある場合があります。それでも、良いスタートになるはずです。

于 2012-12-29T00:35:41.237 に答える