環境 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 にある自動インクリメント値を持つ最後のテーブルに関連しています。
- ループを使用して単一のストアド プロシージャでこのプロセスを完了しようとしましたが、成功しませんでした。
- また、最初のプロシージャで LAST INSERT ID の値を返して、2 番目のプロシージャに渡すときに使用できるようにしました。
私はまだ学んでいるので、これらの試みは失敗に終わりました。ストアド プロシージャのデバッグは、phpMyAdmin を使用しても十分に困難です。
2番目の挿入が発生しない理由を誰か教えてもらえますか? 問題を解決するにはどうすればよいですか?