首页 > 解决方案 > 为什么我不能在 PHP 中创建 MySQL 存储过程?

问题描述

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

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 选项卡中运行代码时,我是否遗漏了上面代码中的一些重要内容?

提前致谢 :)

标签: phpmysqlstored-procedures

解决方案


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

请改为执行以下操作:

// 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);

推荐阅读