PHPからMySQLにストアドプロシージャを挿入/作成する方法は?
-
14-10-2019 - |
質問
MySQLワークベンチで作成された多くのストアドプロシージャがあります。 MySQLワークベンチを使用して私のテストDBに入れると、うまく機能します。
今、私は展開のためのDB作成スクリプトを準備していますが、これが私にトラブルを与えてくれた唯一のものです。コマンドライン / MySQLシェルを使用すると、スクリプトは完全にうまく機能します。 PHP MySQL(i)インターフェイスを使用してスクリプトを実行したときだけです - 失敗します。コメントなし。
MySQL Workbenchが生成するので、手順作成スクリプトを使用します。つまり、このパターンがあります。
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で実行します。インターフェイスにエラーが返されず、結果もありません(!)。私が得るのは「偽」だけです、そしてそれだけです。エラーコードは0で、エラーメッセージはありません。
それは私にとって大きなWTFであり、あなたが私を正しい方向に向けることができることを願っています - これを修正してPHPから手順をインストールするにはどうすればよいですか?
PS:ルート/管理者アクセスが指定され、検証されます(結局のところ、私はまったく同じ接続、作成されたユーザー、挿入テーブルなどでDBを作成しました)。
解決
私はテストしていませんが、私は驚かないでしょう mysqli_multi_query()
各クエリと同じ区切り文字があることを期待しています。 Delimiter Modifierを使用せずに、ストアドプロシージャの作成を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');
そして、それが機能するかどうか教えてください:)
他のヒント
要約すると:
Delimiterは、サーバーサイドではなく、クライアント側に実装されています。
優れたドライバーまたはAPIがある場合は、これを処理する場合があります。 PHP mysql / mysqliは、今のところ、そうではありません。
別の区切り文字を使用する必要がある場合(たとえば、デフォルトのデリミッターがスクリプト内に表示されるため)、SQLを自分でエンコード/エスケープするか、デリミタを変更する必要がないようにする必要があります。ここではPHPの助けはありません。
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