Ich würde den folgenden Code verwenden.
foreach ($user_emails as $value) {
$query = db_insert('banned_users');
$query->fields(array('email' => $value))->execute();
}
Alternativ können Sie den folgenden Code verwenden.
$query = db_insert('banned_users')->fields(array('email'));
foreach ($user_emails as $value) {
$query->values(array('email' => $value));
}
$query->execute();
Bei MySQL verwendet die Abfrage die mehrwertige Syntax.
Bei anderen Datenbanken sind die ausgeführten Abfragen eine für jeden Aufruf von $query->values()
, die in eine Transaktion eingeschlossen sind. Dies bedeutet, dass die Abfragen zurückgesetzt werden, wenn eine davon fehlschlägt. Tatsächlich ist der von InsertQuery :: execute () ausgeführte Code der folgende.
// 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;
}
Kurz gesagt, ich würde den von Ihnen verwendeten Code verwenden, wenn die eingefügten Werte unabhängig voneinander sind. Ich würde den Code verwenden, den ich gezeigt habe, wenn die Werte voneinander abhängen.
In Ihrem Fall sind die E-Mails unabhängig voneinander. Wenn Sie das zweite von mir gezeigte Snippet verwenden würden, enthält die Datenbanktabelle alle Werte, wenn die Unterabfrage nicht fehlschlägt, oder keine, wenn eine einzelne Unterabfrage fehlschlägt.
Sie könnten auch verwenden drupal_write_record()
, obwohl ich die anderen Schnipsel sehr bevorzuge.
foreach ($user_emails as $value) {
drupal_write_record('banned_users', array('email' => $value));
}
Ich sehe jedoch keinen Profi darin, dieses Snippet zu verwenden.
Referenz
$values
und rufen Sie nur 1 aufexecute()
. drupal.org/node/310079 Dies wird beispielsweise bei der Erstellung von Standardblöcken für Standardprofile verwendet.->values(...)
so oft anrufen, wie Sie möchten,InsertQuery
und es wird eine Abfrage wieINSERT INTO x (field1, field2) VALUES ('val1', 'val2'), ('val3', 'val4'), etc
$query->values()
: In den meisten Fällen sind die Werte, die mein Code einfügt, unabhängig voneinander, und ich möchte nicht, dass ein Fehler mit einem Wert ein Rollback der anderen Werte verursacht.Dies ist eine ähnliche Version wie Ihr Code, aber eine bessere Leistung. Sie möchten execute () wirklich nicht tausendmal aufrufen, sondern müssen es nur einmal aufrufen.
Referenz
quelle