2

次の行のPHPスクリプトがあります。

require_once 'meekrodb.2.1.class.php';
DB::$user = 'usr';
DB::$password = 'pwd';
DB::$dbName = 'db';
DB::$encoding = 'utf8';

$results = DB::queryFirstField("
    CALL getSequence('time_id', %i); // ***** Stored procedure call *****
", TENANT_ID);

DB::insert('timeentry', array(
    'tenant_id' => TENANT_ID,
    'time_id' => $results,
    'timestart' => DB::sqleval("now()"),
    'assig_id' => $assig_id
));

次のエラーが発生します。

クエリ:INSERT INTO timeentrytenant_id、、、 )VALUES(1 time_id、'42'、now()、' 1' timestartassig_id

エラー:コマンドが同期していません。現在、このコマンドを実行することはできません

ストアドプロシージャの呼び出しをSELECTステートメントに置き換えると、すべて正常に機能します。

$results = DB::queryFirstField("
    SELECT 45; // ***** SELECT statement *****
");

DB::insert('timeentry', array(
    'tenant_id' => TENANT_ID,
    'time_id' => $results,
    'timestart' => DB::sqleval("now()"),
    'assig_id' => $assig_id
));

MeekroDBライブラリ(http://www.meekro.com)の内部は分析していません。

各ステートメントをトランザクションでラップしようとしましたが、ストアドプロシージャの呼び出しの直後にCOMMITを実行すると、同じエラーが発生します。

どんな助けでも大歓迎です。

4

1 に答える 1

2

MySQLのストアドプロシージャを呼び出すと、複数の結果セットが生成されます。つまり、ストアドプロシージャには複数のSELECTが含まれている 可能性があるため、クライアントはCALLの処理を完了するために複数の結果セットを反復処理する必要があります。

この質問への回答の例を参照してください:php/mysqliのストアドプロシージャを使用した複数の結果セットの取得

CALLからのすべての結果が終了するまで、それは閉じているとは見なされず、MySQLは、現在のクエリが完全に終了する前に別のクエリを実行することを許可しません。

MeekroDBライブラリについてはよくわかりませんが、オンラインドキュメントを見ると、複数の結果セットを反復処理する方法がわかりません。したがって、ストアドプロシージャを安全に呼び出す方法がない場合があります。特定のサポートについては、作成者に問い合わせることをお勧めします: http ://www.meekro.com/help.php 。

于 2012-12-13T21:29:18.317 に答える