2

SQL ファイルのリストをループしてその内容を実行するデータベース移行 PHP スクリプトを作成しました。プロジェクトのセットアップと更新を自動化するのに役立ちます。現在、次のようなエラーが発生しています。

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

ビュー定義を含むファイルをスクリプトに渡し、それも s を使用していたときに、同じエラーが発生していましたDELIMITER。次に、SQL ファイルから区切り記号を削除するだけの回避策を見つけました。そしてそれはうまくいきました。しかし、ストアド プロシージャには区切り文字の定義が本当に必要なため、現在はオプションではありません。

では、PHP から MySQL ストアド プロシージャを定義するにはどうすればよいでしょうか。(または、一般的に言えば、これはどのように処理する必要SDELIMITERがありますか?)

4

1 に答える 1

3

ネイティブの PHP 関数mysqli::queryを使用することも、mysqli::prepare代わりにストアド プロシージャを作成することもできます。

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

mysqli::multi_query の使用も機能しますが、1 つずつ実行する前に実行するクエリの数をカウントする必要がある場合があるため、処理が少し難しくなります (最後のクエリ区切り文字がオプションである場合、クエリのカウントは面倒な場合があります)。

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_resultsor mysqli:next_resultas loop ステートメントは、一部のクエリが結果を返さずに適切に実行される可能性があるためです。このような場合、すべてのクエリが実行される前にループを中断したくありません。

于 2013-04-22T19:03:01.713 に答える