1

環境 PHP 5.3.5 phpMyAdmin 3.3.9

私には 2 つの手順があり、1 つは単純なダブル挿入を完了します。2 番目のプロシージャはループされ、最初のストアド プロシージャに基づいて LAST INSERT ID 値を呼び出す配列の各値に対して呼び出されます。これは、そのテーブルに自動インクリメント ID 列があるためです。

何らかの理由で、2 番目のプロシージャへの複数の呼び出しは、配列の最初の v 値のみを格納しています。配列に格納する 2 番目の値を取得できません。

最初の手順は次のようになります。

DELIMITER $$
CREATE PROCEDURE proc1(
    IN varData1 LONGTEXT,
    IN userID BIGINT(20)
)
BEGIN 
    INSERT INTO table1 (datetime_created) VALUES (NOW());
    INSERT INTO table2 (ID, userID, data, date_created) 
    VALUES (LAST_INSERT_ID(), userID, varData1, NOW());
END
DELIMITER;

2番目の手順は次のようになります。

DELIMITER $$
CREATE PROCEDURE proc2(
IN ID2 BIGINT(20)
)
BEGIN
INSERT INTO relationshipMany2ManyTable(id1, id2) VALUES (LAST_INSERT_ID(), ID2);
END
DELIMITER;

PHP から、次のように各プロシージャを呼び出しています。

$model->proc1($pmTextArea, $userID);
$model->proc2($commaSeparatedArray);

proc1 の機能の詳細については省略しますが、これは機能し、ストアド プロシージャが上に表示されています。proc2 は最初の実行では機能しますが、その後の実行は機能していないようです。

public function proc2($String_array)
{
    try {
        $value_array = explode(",", $String_array);
        foreach($value_array AS $value)
        {
            $statement =  $this->_dbh->prepare("Call proc2(?)");
            $statement->bindParam(1, trim($value));
            echo 'bind value '.$value.' to table';
            $statement->execute();
        }
    }
    catch(PDOException $e) {
       echo $e->getMessage();
    }
}

proc2 に渡す文字列配列が次の場合:

"1, 2, 3"

エコーステートメントは次のようになります。

bind value 1 to table
bind value 2 to table
bind value 3 to table

ただし、最初の値のみが挿入されます。他の値は挿入されていません。私はこれ、特にストアドプロシージャに不慣れです。LAST INSERT ID を処理する必要があると思いますが、これは proc1 の table2 にある自動インクリメント値を持つ最後のテーブルに関連しています。

  1. ループを使用して単一のストアド プロシージャでこのプロセスを完了しようとしましたが、成功しませんでした。
  2. また、最初のプロシージャで LAST INSERT ID の値を返して、2 番目のプロシージャに渡すときに使用できるようにしました。

私はまだ学んでいるので、これらの試みは失敗に終わりました。ストアド プロシージャのデバッグは、phpMyAdmin を使用しても十分に困難です。

2番目の挿入が発生しない理由を誰か教えてもらえますか? 問題を解決するにはどうすればよいですか?

4

0 に答える 0