J'utiliserais le code suivant.
foreach ($user_emails as $value) {
$query = db_insert('banned_users');
$query->fields(array('email' => $value))->execute();
}
Vous pouvez également utiliser le code suivant.
$query = db_insert('banned_users')->fields(array('email'));
foreach ($user_emails as $value) {
$query->values(array('email' => $value));
}
$query->execute();
Avec MySQL, la requête utilise la syntaxe à valeurs multiples.
Avec d'autres bases de données, les requêtes exécutées seront une pour chaque appel à $query->values()
, encapsulées dans une transaction. Cela signifie que les requêtes seront annulées en cas d'échec de l'une d'entre elles. En fait, le code exécuté à partir de InsertQuery :: execute () est le suivant.
// 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;
}
En bref, j'utiliserais le code que vous utilisez si les valeurs insérées sont indépendantes les unes des autres; J'utiliserais le code que j'ai montré lorsque les valeurs dépendent les unes des autres.
Dans votre cas, les e-mails sont indépendants les uns des autres. Si vous utilisiez le deuxième extrait que j'ai montré, la table de base de données contiendra toutes les valeurs, lorsque la sous-requête n'échouera pas, ou aucune lorsqu'une seule sous-requête échouera.
Vous pouvez également utiliser drupal_write_record()
, même si je préfère de loin les autres extraits.
foreach ($user_emails as $value) {
drupal_write_record('banned_users', array('email' => $value));
}
Cependant, je ne vois aucun pro dans l'utilisation de cet extrait.
Référence
$values
et appelez seulement 1execute()
. drupal.org/node/310079 Ceci est utilisé par exemple dans la création de blocs par défaut des profils standard.->values(...)
autant de fois que vous le souhaitez sur unInsertQuery
et cela préparera une requête commeINSERT INTO x (field1, field2) VALUES ('val1', 'val2'), ('val3', 'val4'), etc
$query->values()
: dans la plupart de mes cas, les valeurs que mon code insère sont indépendantes les unes des autres, et je ne veux pas qu'une erreur avec une valeur provoque une restauration des autres valeurs.Il s'agit d'une version similaire à votre code, mais de meilleures performances. Vous ne voulez vraiment pas appeler execute () mille fois, vous n'avez besoin de l'appeler qu'une seule fois.
Référence
la source