Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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_Delimiter_Database Migration - Fatal编程技术网

如何从PHP创建MySQL存储过程?

如何从PHP创建MySQL存储过程?,php,mysql,stored-procedures,delimiter,database-migration,Php,Mysql,Stored Procedures,Delimiter,Database Migration,我编写了一个数据库迁移PHP脚本,它循环SQL文件列表并执行它们的内容。它应该有助于自动化项目设置和更新。现在我遇到了如下错误: mapCoursesToSport.sql: 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 | DROP PROCEDURE

我编写了一个数据库迁移PHP脚本,它循环SQL文件列表并执行它们的内容。它应该有助于自动化项目设置和更新。现在我遇到了如下错误:

mapCoursesToSport.sql: 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 |
DROP PROCEDURE IF EXISTS mapCoursesToSport|
CREATE PROCEDURE mapCo' at line 1
当我向脚本传递一个带有视图定义的文件时,我遇到了相同的错误,该文件也使用了
分隔符。然后,我找到了解决方法,只是从SQL文件中删除分隔符。它成功了。但现在它不是一个选项,因为存储过程确实需要分隔符定义


那么,如何从PHP定义MySQL存储过程呢?(或者通常是morre:这个
SDELIMITER
应该如何处理?

您可以使用本机PHP函数
mysqli::query
mysqli::prepare
来创建存储过程:

使用mysqli::multi_query也可以工作,但处理起来有点棘手,因为在逐个执行查询之前,可能需要先计算要执行的查询数(如果最终的查询分隔符是可选的,那么计算查询数可能会很繁琐)


您已经在这里发表了评论,下面的答案说明您必须将每个变量逐个传递给
mysql(i)\u query
,而不是使用逗号。谢谢您的提示,但这对我不起作用。我的存储过程中确实需要分隔符。所以我不能从代码中删除它们。如果我这样做,则不会创建过程。您不需要分隔符吗?分号应该按原样传递。。。不要以一个定界符结束你的查询,我写道,我不需要定界符。。。但无论如何,现在禁用
分隔符
s的解决方法对我来说是可行的。我的错误是,我不仅注释掉了特定的分隔符行(
delimiter$$
),而且注释掉了带有
END$$
的行,而且忘记了用分号替换第一行(
DROP PROCEDURE IF EXISTS mapCoursesToSport$
)中的分隔符。工作版本如下所示:
DROP PROCEDURE IF EXISTS mapCoursesToSport。。。结束
,与您链接的注释中的代码非常相似…:)非常感谢。可能的副本谢谢你的回答!我真的不明白它应该如何工作。。。您要将什么传递给
多重查询
?您如何定义
queryCount
?在何处/如何使用
$results
数组?用于创建过程的所有查询都应传递给multi_query。查询计数可以使用存储在传递给mysql\u multi\u query的变量中的查询字符串的
内爆
on”;(如果定义为查询分隔符)来定义。我已经介绍了results数组来涵盖一般情况(在这种情况下,我不想创建一个过程,而是执行返回结果的多个查询)。请考虑下面的第一个链接指向的文档,因为它的使用更简单。谢谢您的详细解释!我给你的答案加1,因为它非常详细,包含了一个例子,但我没有接受它,因为我已经找到了bwoebi的答案。请看。谢谢!您是否愿意编辑您的问题,并在附加的“编辑”段落下做出正确的答案(或指向它的链接)?
    <?php
    // Using mysqli extension below in object-oriented mode 
    // after having executing queries 
    // with mysqli::multi_query

    do {
        $queryResult = $mysqli->use_result();
        unset($results);
        while ($result = $queryResult->fetch_array(MYSQLI_ASSOC)) {
            $results[] = $result;
        }
        $queryResult->close();

        if ($mysqli->more_results()) {
            $mysqli->next_result();
        }

        $queryCount--;
    } while ($queryCount > 0);