Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能用PHP创建一个MySQL存储过程吗?_Php_Mysql_Stored Procedures - Fatal编程技术网

为什么可以';我不能用PHP创建一个MySQL存储过程吗?

为什么可以';我不能用PHP创建一个MySQL存储过程吗?,php,mysql,stored-procedures,Php,Mysql,Stored Procedures,我尝试使用以下代码创建一个存储的prucedure: 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 (

我尝试使用以下代码创建一个存储的prucedure:

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选项卡中运行代码时不知何故包含在其中

提前感谢:)

  • 在尝试使用应用程序代码创建存储过程时,不需要重新定义分隔符
  • 另外,为了避免在某些情况下出现异常,请在CREATEPROCEDURE语句之前调用
    DROP 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);

在使用mysql的应用程序代码/命令行时,不要使用重新定义的分隔符语法。我们重新定义了分隔符,以阻止PHPMyadmin解析
作为执行触发器谢谢您的评论!由于我对使用和创建存储过程非常陌生,所以我不太确定在我的情况下应该做些什么。你能详细解释一下吗@MadhurBhaiya@janika23很乐意帮助:)请现在查看更新的答案。我又添加了一个解释,这将有助于您,这实际上是我的系统开始抱怨的下一件事,我开始进行新的研究!多谢!