22

複数のクエリを実行する 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);

そのようにすると、エラーが発生します: Call to a member function bind_param() on a non-object in...

$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(); 
4

2 に答える 2

30

準備済みステートメントは、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()これは通常、後からではなく、ステートメントのエラーを探す必要があることを意味します。

于 2012-07-24T16:55:22.833 に答える
17

いいえ、mysqliprepare()関数の 1 回の呼び出しで、一度に複数のクエリを準備することはできません。ただし、異なる変数を使用して、複数のクエリを実行用に準備することができます。この関数のドキュメントは、こちらから入手できます。

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

于 2012-07-24T16:15:04.843 に答える