【问题标题】:Why can't I create a MySQL stored procedure in PHP?为什么我不能在 PHP 中创建 MySQL 存储过程?
【发布时间】:2019-03-05 10:37:05
【问题描述】:

我尝试使用以下代码创建存储过程:

DELIMITER //
CREATE PROCEDURE AddTrickBaseInvert(
    IN invertName       VARCHAR(16),
    IN invertType       TINYINT(1)
)
BEGIN
    INSERT INTO trick_bases (type)
    VALUES (1);
    INSERT INTO trick_bases_invert (
        baseId,
        name,
        type
    )
    VALUES (
        LAST_INSERT_ID(),
        name,
        type
    );
END //
DELIMITER ;

当我尝试在 localhost/phpmyadmin/ 上运行 MySQL 测试时它起作用了,但是当我尝试通过 PHP 使用相同的 SQL 代码创建相同的过程时,它给了我以下错误:

致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“DELIMITER $$ CREATE PROCEDURE AddTrickBaseInvert( IN invertName ”附近使用正确的语法 ...

PHP 代码在这里:

$sql = '
DELIMITER //
CREATE PROCEDURE AddTrickBaseInvert(
    IN invertName       VARCHAR(16),
    IN invertType       TINYINT(1)
)
BEGIN
    INSERT INTO trick_bases (type)
    VALUES (1);
    INSERT INTO trick_bases_invert (
        baseId,
        name,
        type
    )
    VALUES (
        LAST_INSERT_ID(),
        name,
        type
    );
END //
DELIMITER ;';
$oDb->exec($sql);

如您所见,SQL 代码完全相同,但不知何故没有创建过程。我试图做研究,但我还没有找到任何答案。当我在 localhost/phpmyadmin 的 SQL 选项卡中运行代码时,我是否遗漏了上面代码中的一些重要内容?

提前致谢:)

【问题讨论】:

  • 不要使用重新定义分隔符语法,当使用mysql的应用程序代码/命令行时。我们重新定义了分隔符,以阻止 PHPMyadmin 将 ; 解析为执行触发器
  • 感谢您的评论!由于我对使用和创建存储过程还很陌生,所以我不太确定在我的情况下应该做些什么不同的事情。你能更详细地解释一下吗? @MadhurBhaiya

标签: php mysql stored-procedures


【解决方案1】:
  • 在尝试使用应用程序代码创建存储过程时,您无需重新定义分隔符。
  • 另外,为避免在某些情况下出现异常,请在 Create procedure 语句之前调用 DROP PROCEDURE IF EXISTS。

改为执行以下操作:

// drop if procedure exists already or not
$sql_drop = 'DROP PROCEDURE IF EXISTS AddTrickBaseInvert';
$oDb->exec($sql_drop);

// Now call create procedure statement
$sql = '
CREATE PROCEDURE AddTrickBaseInvert(
    IN invertName       VARCHAR(16),
    IN invertType       TINYINT(1)
)
BEGIN
    INSERT INTO trick_bases (type)
    VALUES (1);
    INSERT INTO trick_bases_invert (
        baseId,
        name,
        type
    )
    VALUES (
        LAST_INSERT_ID(),
        name,
        type
    );
END';
$oDb->exec($sql);

【讨论】:

  • @janika23 很高兴为您提供帮助 :) 请立即查看更新后的答案。我又加了一个解释,对你有帮助
  • 这实际上是我的系统开始抱怨的下一个问题,我开始进行新的研究!非常感谢!
猜你喜欢
  • 2022-08-17
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多