web-dev-qa-db-ja.com

mysqli:1つのステートメントで複数のクエリを準備できますか?

複数のクエリを実行する1つのmysqliステートメントを準備できるかどうか知りたいです。

mysqli->prepare(query1 ...1,2,3 param...; query2...4,5 param...);
or 
mysqli->prepare(insert into ...1,2,3 param...; insert into...4,5 param...);
and after all
mysqli->bind_param("sssss", 1, 2, 3, 4, 5);

そのようにしてエラーが発生します:非オブジェクトのメンバー関数bind_param()の呼び出し...

$stmt = $sql->getQueryPrepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?); INSERT INTO process (id_user, idp) VALUES (?,?);");

$stmt->bind_param("ssssss",$id, $username, $pw, $email, $id, $idp);

$stmt->execute();
$stmt->close(); 
17
Donovant

準備されたステートメントは、1つのMySQLクエリしか実行できません。さまざまな変数に必要な数のステートメントを準備できます。

_$stmtUser = $sql->prepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?)");
$stmtProc = $sql->prepare("INSERT INTO process (id_user, idp) VALUES (?,?);");
_

そして、後で実行します。どちらも実行できない限り、どちらも実行されないようにするには、トーマスが言ったように、トランザクションを調べる必要があります。

また、一般的なヒント:「非オブジェクトのメンバー関数の呼び出し」は、prepare()が失敗したときに表示される標準エラーなので、_$stmt_は実際には準備されたステートメントオブジェクトではありません。これは通常、後で何よりもprepare()ステートメントでエラーを探す必要があることを意味します。

26
octern

いいえ、mysqli prepare()関数を1回呼び出すだけでは、一度に複数のクエリを準備できません。ただし、さまざまな変数を使用して、実行用に複数のクエリを準備することができます。 この関数のドキュメントはここにあります。

また、トランザクションをセットアップしようとしているように見えます。これは、あなたが尋ねたのとは異なる質問です。それが本当に知りたい場合は、データベースのセットアップに関する詳細情報と、解決しようとしているユースケースに関するより詳細な情報を提供する必要があります。

16
Thomas