2

我编写了一个数据库迁移 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

当我将具有视图定义的文件传递给脚本时,我遇到了同样的错误,该文件也使用了DELIMITERs. 然后我找到了解决方法,只是从 SQL 文件中删除分隔符。它奏效了。但现在它不是一个选项,因为存储过程确实需要定界符定义。

那么,如何从 PHP 中定义 MySQL 存储过程呢?(或者更一般地说:应该如何SDELIMITER处理?)

4

1 回答 1

3

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

http://php.net/manual/en/mysqli.quickstart.stored-procedures.php

使用 mysqli::multi_query 也可以,但处理起来有点棘手,因为您可能需要在一个一个执行之前计算要预先执行的查询的数量(假设最终的查询分隔符是可选的,计算查询可能很乏味)

http://php.net/manual/en/mysqli.multi-query.php

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

PS:我不使用mysqli:more_results也不mysqli:next_result作为循环语句的原因是某些查询可能会正确执行而不会返回任何结果。在这种情况下,我们不想在执行所有查询之前中断循环。

于 2013-04-22T19:03:01.713 回答