次のコードを使用します。
foreach ($user_emails as $value) {
$query = db_insert('banned_users');
$query->fields(array('email' => $value))->execute();
}
または、次のコードを使用することもできます。
$query = db_insert('banned_users')->fields(array('email'));
foreach ($user_emails as $value) {
$query->values(array('email' => $value));
}
$query->execute();
MySQLでは、クエリは複数値構文を使用します。
他のデータベースでは、実行されるクエリは$query->values()
、トランザクションにラップされたへの呼び出しごとに1つになります。つまり、クエリの1つが失敗すると、クエリはロールバックされます。実際、InsertQuery :: execute()から実行されるコードは次のコードです。
// Each insert happens in its own query in the degenerate case. However,
// we wrap it in a transaction so that it is atomic where possible. On many
// databases, such as SQLite, this is also a notable performance boost.
$transaction = $this->connection->startTransaction();
try {
$sql = (string) $this;
foreach ($this->insertValues as $insert_values) {
$last_insert_id = $this->connection->query($sql, $insert_values, $this->queryOptions);
}
}
catch (Exception $e) {
// One of the INSERTs failed, rollback the whole batch.
$transaction->rollback();
// Rethrow the exception for the calling code.
throw $e;
}
つまり、挿入された値が互いに独立している場合は、使用しているコードを使用します。値が互いに依存している場合は、ここで示したコードを使用します。
あなたの場合、電子メールは互いに独立しています。私が示した2番目のスニペットを使用する場合、データベーステーブルには、サブクエリが失敗しない場合はすべての値が含まれ、単一のサブクエリが失敗する場合は何も含まれません。
drupal_write_record()
他のスニペットの方がずっと好きですが、を使用することもできます。
foreach ($user_emails as $value) {
drupal_write_record('banned_users', array('email' => $value));
}
ただし、このスニペットを使用しているプロはいない。
参照
$values
のみを呼び出しますexecute()
。drupal.org/node/310079これは、たとえば、標準プロファイルのデフォルトブロックの作成で使用されます。