6

MySQLiでプリペアドステートメントを使用してデータを挿入する方法を学習しようとしています。

プリペアドステートメントは、同様のステートメントを効率的に繰り返し実行できることで賞賛されていますが、MySQLiを使用してループ内で複数のステートメントを実行する例を見つけることができないようです。私は特に次のことについて混乱しています

  • ループの前に呼び出すかbind_param、ループの内側に呼び出すか
  • の呼び出しの前または後に変数に値を割り当てるかどうかbind_param

プリペアドステートメントに関するほとんどのチュートリアルでは、PDOを使用しています。PDOを使用すると、パラメーター値の配列をに渡すことができるexecuteため、を呼び出す必要がなくなりますbindParam。これはMySQLiには当てはまりません。

PHPの手動mysqli_prepareエントリには、次の操作の順序を示す例があります。

  1. 変数に値を割り当てる
  2. プリペアドステートメント
  3. バインド変数
  4. 実行する
  5. 選ぶ

上記から判断すると、ループ内でbindステートメントを呼び出す必要があると思いました。

ただし、PHPの手動mysqli_stmt_executeエントリには、次の操作の順序を示す例があります。

  1. プリペアドステートメント
  2. バインド変数
  3. 変数に値を割り当てる
  4. 実行する
  5. 変数に値を割り当てる
  6. 実行する
  7. 選ぶ

この例では示されていないことの1つは、変数が最初に宣言される場所であることに注意してください。bind_param宣言されていない変数を渡すと通知が生成されると思いました。未定義の変数は参照によって渡されるため、それらを渡すことができることがようやくわかりました。

質問
操作の1つの順序が他の順序よりも優先されますか?それとも、それはあなたがしていることに依存しているだけですか?どちらか一方に落とし穴はありますか?

注:コードはすでにMySQLiを使用しているため、PDOに切り替えたくありません(切り替えはこのプロジェクトの範囲外です)。

4

1 に答える 1

7

パラメータは参照によって渡されるため、の呼び出しの前または後に値を変数に割り当てることができますbind_param。どちらの方法でも機能します。

変数が値で渡された場合、値を変更するたびに変数をバインドする必要があります。ただし、参照によって渡されるため、バインドする必要があるのは1回だけです。

単一の実行の場合、操作の順序は実際には重要ではなく、値がどこから来ているかに依存する可能性があります。ループの場合は、必ずbind_paramループの前に呼び出す必要があります。

于 2012-12-12T17:55:17.673 に答える