web-dev-qa-db-fra.com

Comment puis-je enregistrer des tableaux de valeurs dans la base de données?

J'essaie d'enregistrer plusieurs valeurs d'une zone de texte dans une table de base de données.

J'utilise le code suivant, mais je pense que c'est la mauvaise façon.

foreach ($user_emails as $key => $value) {
  $insert_banned_emails = db_insert('banned_users');
  $insert_banned_emails
    ->fields(array(
      'email' => $value,
    ))
    ->execute();
}

Existe-t-il une manière différente d'obtenir le même résultat?

8
Mohamed Ibrahim

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(), enveloppé 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 souhaitez utiliser le deuxième extrait que j'ai montré, la table de base de données contient toutes les valeurs, lorsque la sous-requête n'échoue pas, ou aucune lorsqu'une seule sous-requête échoue.

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

15
kiamlaluno

Il s'agit d'une version similaire à votre code, mais de meilleures performances. Vous ne voulez vraiment pas mille fois exécuter (), vous n'avez besoin de l'appeler qu'une seule fois.

Référence

$insert_banned_emails = db_insert('banned_users')->fields(array('email'));
foreach ($user_emails as $key => $value) {
  $insert_banned_emails->values(array(
    'email' => $value,
  ));               
}
$insert_banned_emails->execute();
3
donutdan4114