繁体   English   中英

不能使用mysqli创建过程,但是可以使用phpmyadmin创建过程?

[英]Can't create procedure with mysqli, but can with phpmyadmin?

试图通过mysqli中的mysqli创建存储过程。 当我通过php进行操作时,请始终返回1064错误,但是当我在php中复制相同的sql命令时,它会很好。 任何人都可以弄清楚可能是什么问题,或者有人找到了解决类似问题的方法?

创建过程代码:

DELIMITER //
CREATE PROCEDURE 6de443aacf727f6009e857480f33153cmakeLive (IN taskID INT, IN avaliableTime INT)
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE a INT;
        DECLARE cur1 CURSOR FOR SELECT t.`task_id`
            FROM `task_dependency` d
            LEFT OUTER JOIN (
                SELECT `task_id`, `dependent_on_task_id`, ti.`id`, min(ti.`completed`) as make_live
                FROM `task_dependency`
                LEFT OUTER JOIN (
                    SELECT `task_id`, `completed` FROM `6de443aacf727f6009e857480f33153c_tasks`
                ) ti ON ti.`task_id` = `dependent_on_task_id`
                GROUP BY `task_id`
            ) t ON d.`task_id` = t.`task_id`
            WHERE d.`dependent_on_task_id` = taskID
                AND t.make_live > 0;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

        OPEN cur1;

        read_loop: LOOP
            FETCH cur1 INTO a;
            IF done THEN
                LEAVE read_loop;
            END IF;
            UPDATE `6de443aacf727f6009e857480f33153c_tasks` SET `live` = 1 WHERE `task_id` = a;
        END LOOP;

        CLOSE cur1;

        UPDATE `6de443aacf727f6009e857480f33153c_tasks` SET `earliest_start` = avaliableTime WHERE `task_id` IN (
            SELECT `task_id`
            FROM `task_dependency`
            WHERE `dependent_on_task_id` = taskID
        ) AND `earliest_start` < avaliableTime;
    END //
DELIMITER ;

PHP代码:

if (!$this->dbc->query("DROP PROCEDURE IF EXISTS " . $this->table_prefix . "makeLive") ||
    !$this->dbc->query($query)) {
    echo "Stored procedure creation failed: (" . $this->dbc->errno . ") " . $this->dbc->error . "<br /><br />" . $query;
    exit;
}
echo "success";
exit;

脚本执行抛出以下错误...

Stored procedure creation failed: (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 'DELIMITER //
        CREATE PROCEDURE 6de443aacf727f6009e857480f33153cmakeLive (IN tas' at line 1

尽管它说这是语法错误,但是将命令直接复制并粘贴到phpmyadmin似乎有效,看起来好像可能是某种mysqli错误?

查询功能仅允许您执行一个查询。 请尝试使用multi_query函数(文档: http ://www.php.net/manual/zh/mysqli.multi-query.php)。 它允许使用多个命令,并且可以解决您的问题。

原来mysqli-> query已经解析了分号并运行了整个命令。 在查询的开始和结尾处使用定界符命令,对于成功创建过程而言是不必要的。

只需删除DELIMITER,它就会起作用。 因此,在您的情况下,它将是这样的:

CREATE PROCEDURE 6de443aacf727f6009e857480f33153cmakeLive (IN taskID INT, IN avaliableTime INT)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE a INT;
    DECLARE cur1 CURSOR FOR SELECT t.`task_id`
        FROM `task_dependency` d
        LEFT OUTER JOIN (
            SELECT `task_id`, `dependent_on_task_id`, ti.`id`, min(ti.`completed`) as make_live
            FROM `task_dependency`
            LEFT OUTER JOIN (
                SELECT `task_id`, `completed` FROM `6de443aacf727f6009e857480f33153c_tasks`
            ) ti ON ti.`task_id` = `dependent_on_task_id`
            GROUP BY `task_id`
        ) t ON d.`task_id` = t.`task_id`
        WHERE d.`dependent_on_task_id` = taskID
            AND t.make_live > 0;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur1;

    read_loop: LOOP
        FETCH cur1 INTO a;
        IF done THEN
            LEAVE read_loop;
        END IF;
        UPDATE `6de443aacf727f6009e857480f33153c_tasks` SET `live` = 1 WHERE `task_id` = a;
    END LOOP;

    CLOSE cur1;

    UPDATE `6de443aacf727f6009e857480f33153c_tasks` SET `earliest_start` = avaliableTime WHERE `task_id` IN (
        SELECT `task_id`
        FROM `task_dependency`
        WHERE `dependent_on_task_id` = taskID
    ) AND `earliest_start` < avaliableTime;
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM