6

MySQL Workbench で作成されたストアド プロシージャがいくつかあります。MySQL ワークベンチを使用してテスト DB に配置すると、問題なく動作します。

現在、デプロイ用の DB 作成スクリプトを準備していますが、これだけが問題です。コマンドライン/mysqlシェルを使用すると、スクリプトは完全に機能します。これは、PHP mysql(i) インターフェイスを使用してスクリプトを実行した場合にのみ発生します。失敗します。コメントなし。

MySQL ワークベンチが生成するプロシージャ作成スクリプトを使用します。つまり、次のパターンがあります。

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

スクリプトの開始時に、手順ごとに繰り返します。

DELIMITER $$
USE `dbname`$$
CREATE PROCEDURE `procname`(IN inputparameters)
BEGIN

・・・手順はこちら

;
END$$
DELIMITER ;

このスクリプトは、MySQL Workbench から実行すると正常に機能します。mysqlコマンドラインから同じことを試しても問題なく動作します。しかし、PHP mysqli インターフェイスを介して実行すると、何も達成できません (mysqli_multi_query で実行すると、DB を作成および設定する他のスクリプトで正常に動作します)。インターフェイスで返されるエラーはなく、結果もありません (!)。私が得るのは「false」だけです。それだけです。エラー コードは 0 で、エラー メッセージはありません。

それは私にとって大きなWTFであり、正しい方向に私を向けることができることを願っています-どうすればこれを修正し、PHPから手順をインストールできますか?

PS: root/admin アクセス権が付与され、検証されます (結局のところ、まったく同じ接続で DB を作成し、ユーザーを作成し、テーブルを挿入しただけです)。

4

3 に答える 3

7

テストはしていませんがmysqli_multi_query()、各クエリの区切り文字が同じであることを期待しても驚かないでしょう。DELIMITER 修飾子を使用せずに、ストアド プロシージャの作成を 1 つのクエリにまとめてみませんか?

だから代わりに

<?php
$results = mysqli_multi(
    'DELIMITER $$
    USE `dbname`$$
    CREATE PROCEDURE `procname`(IN inputparameters)
    BEGIN
    ... procedure goes here

    ;
    END$$
    DELIMITER ;
');
?>

これをするだけ

<?php
$result = mysqli_query('CREATE PROCEDURE `procname`(IN inputparameters) BEGIN ...; END');

そして、それが機能するかどうか教えてください:)

于 2011-01-16T11:44:06.777 に答える
1

要約すると:

DELIMITER は、サーバー側ではなく、クライアント側で実装されます。

優れたドライバーまたは API を使用している場合は、これで問題が解決する可能性があります。PHP mysql / mysqli は、今のところそうではありません。

別の区切り文字を使用する必要がある場合 (たとえば、デフォルトの区切り文字がスクリプト内に表示されるため)、SQL を自分でエンコード/エスケープするか、区切り文字を変更する必要がないように分割する必要があります。ここでは PHP の助けはありません。

于 2014-02-19T13:26:06.517 に答える
-3

DELIMITER は、mysql クライアント アプリケーションが実際に使用するものです。クライアント アプリケーションは、Mysql に送信するクエリを分割する責任があると思います。たとえば、これは PHPMyAdmin が行うことです。

MySQL をクエリに解析するためのスクリプトを書くのに一晩を費やす代わりに、私が書いたコードを使用してください。次の scriptToQueries 関数にあります。

http://wush.net/svn/luckyapps/pie/trunk/framework/classes/Db/Mysql.php

楽しい

編集: この回答を書いてから、コードを学習できる無料の Q プラットフォームにコードを移植しました: https://github.com/EGreg/Platform/blob/master/platform/classes/Db/Mysql.php# L824

于 2011-02-17T06:25:38.620 に答える