【问题标题】:Can't create procedure with mysqli, but can with phpmyadmin?不能用 mysqli 创建程序,但可以用 phpmyadmin?
【发布时间】:2013-08-07 00:14:44
【问题描述】:

试图在php中通过mysqli创建一个存储过程。当我通过 php 执行此操作时,继续返回 1064 错误,但是当我在 php.ini 中复制相同的 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 错误?

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

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

    【讨论】:

    • 为那个干杯,那里完全监督。
    • 分离了查询,但看起来DELIMITER有问题 //,为此拉出1064的错误,知道DELIMITER是否无法通过mysqli->query运行?
    • stackoverflow.com/questions/15418218/… - 看起来 DELIMITER 在 mysqli 上是不可能的,在这里与失败的原因作斗争。将不得不寻找其他方法。虽然如果使用已弃用的 mysql 函数可能会适得其反
    • 抱歉评论,看起来 mysqli->query 运行整个命令,而不仅仅是分号之前的第一个命令,所以分隔符不是必需的,只需发出该过程的命令
    【解决方案2】:

    原来 mysqli->query 已经解析了分号并运行了整个命令。查询开头和结尾处的分隔符命令对于成功创建过程是不必要的。

    【讨论】:

      【解决方案3】:

      只需删除 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;
      

      【讨论】:

        猜你喜欢
        • 2021-04-15
        • 2021-11-27
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 2013-03-14
        • 2021-12-09
        相关资源
        最近更新 更多