wpdb->insert múltiples registros a la vez

3 mar 2014, 16:15:20
Vistas: 36.6K
Votos: 12

Después de haber creado la tabla 'settings-table' quiero añadir varios registros a la misma.

Así es como quiero hacerlo, aunque no es la mejor manera, por lo que necesito una mejor forma ya que añadiré más registros a la tabla.

EJEMPLO 1

$wpdb->insert('settings-table', array('option_name'   => 'nombre-1', 
                                       'option_value'  => 'valor-1', 
                                       'option_created'=> current_time('mysql'),
                                       'option_edit'   => current_time('mysql'),
                                       'option_user'   => 'usuario-1' 
                                       ));    
$wpdb->insert('settings-table', array('option_name'   => 'nombre-2', 
                                       'option_value'  => 'valor-2', 
                                       'option_created'=> current_time('mysql'),
                                       'option_edit'   => current_time('mysql'),
                                       'option_user'   => 'usuario-2' 
                                       ));
$wpdb->insert('settings-table', array('option_name'   => 'nombre-1', 
                                       'option_value'  => 'valor-3', 
                                       'option_created'=> current_time('mysql'),
                                       'option_edit'   => current_time('mysql'),
                                       'option_user'   => 'usuario-3' 

ACTUALIZACIÓN

Esto funciona (otras soluciones mejores son bienvenidas)

$wpdb->query("INSERT INTO settings-table
            (`option_name`, `option_value`, `option_created`, `option_edit`, `option_user`)
            VALUES
            ('nombre-1', 'valor-1', current_time('mysql'), current_time('mysql'), 'usuario-1'),
            ('nombre-2', 'valor-2', current_time('mysql'), current_time('mysql'), 'usuario-2'),
            ('nombre-3', 'valor-3', current_time('mysql'), current_time('mysql'), 'usuario-3')")
6
Comentarios

¿Para qué son estos ajustes? Deberías considerar usar la tabla options (con toda la funcionalidad de WP que existe para ella), o postmeta o usermeta (de nuevo, con toda la funcionalidad de WP que ya existe alrededor de estas). Finalmente: si quieres usar tu propia tabla, probablemente un bucle te daría lo que necesitas, pero necesitaríamos más contexto, entender qué es lo que intentas lograr en el "panorama general".

random_user_name random_user_name
3 mar 2014 17:04:05

El ejemplo anterior es solo un ejemplo, no quiero usar la tabla wp-options. No puedo dar más información porque no hay más, es muy básico, solo necesito añadir múltiples registros dentro de la tabla.

user759235 user759235
3 mar 2014 17:11:38

tu uso de prepare es incorrecto, lo que probablemente generaría una advertencia. consulta el codex para el formato correcto.

Milo Milo
3 mar 2014 17:44:32

Sí, lo he visto, lo he cambiado, pero todavía necesito una forma de agregar múltiples registros a la tabla

user759235 user759235
3 mar 2014 17:53:49

Puedes dar más información. ¿Qué tipo de registros estás insertando? ¿Cómo se están generando los registros? De nuevo, probablemente un bucle te daría lo que necesitas, pero sin más contexto, es difícil proporcionar una respuesta útil. Por cierto, podrías usar un simple $wpdb->query() con un conjunto de valores de inserción construidos manualmente para insertar múltiples filas a la vez...

random_user_name random_user_name
3 mar 2014 18:03:29

Lo he resuelto usando el $wpdb->query().

user759235 user759235
3 mar 2014 18:06:50
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 4
0
10
$wpdb->query("INSERT INTO settings-table
            (option_name, option_value, option_created, option_edit, option_user)
            VALUES
            ('name-1', 'val-1', current_time('mysql'), current_time('mysql'), 'user-1'),
            ('name-2', 'val-2', current_time('mysql'), current_time('mysql'), 'user-2'),
            ('name-3', 'val-3',  current_time('mysql'), current_time('mysql'), 'user-3')")

En la consulta que has publicado, los nombres de las columnas no deberían estar entre comillas.

25 jun 2014 05:23:02
0

$wpdb->insert no admite la inserción de múltiples registros en una sola llamada a la función. Tienes que iterar sobre tus datos, prepararlos para la inserción y luego usar $wpdb->insert dentro de un bucle para insertar los registros uno por uno.

En su lugar, podemos preparar la consulta de inserción de la siguiente manera y ejecutar la consulta solo una vez.

Así que, si queremos insertar 100 registros, necesitamos ejecutar 100 consultas de inserción si usamos $wpdb->insert. Y si usamos el siguiente código, solo necesitamos ejecutar 1 consulta de inserción.

Espero que esto ayude.

function do_insert($place_holders, $values) {

    global $wpdb;

    $query           = "INSERT INTO settings-table (`option_name`, `option_value`, `option_created`, `option_edit`, `option_user`) VALUES ";
    $query           .= implode( ', ', $place_holders );
    $sql             = $wpdb->prepare( "$query ", $values );

    if ( $wpdb->query( $sql ) ) {
        return true;
    } else {
        return false;
    }

}

$data_to_be_inserted = array( array(
    'option_name'   => 'name-1', 
    'option_value'  => 'val-1', 
    'option_created'=> current_time('mysql'),
    'option_edit'   => current_time('mysql'),
    'option_user'   => 'user-1' 
),

array(
    'option_name'   => 'name-2', 
    'option_value'  => 'val-2', 
    'option_created'=> current_time('mysql'),
    'option_edit'   => current_time('mysql'),
    'option_user'   => 'user-2' 
),
array(
    'option_name'   => 'name-1', 
    'option_value'  => 'val-3', 
    'option_created'=> current_time('mysql'),
    'option_edit'   => current_time('mysql'),
    'option_user'   => 'user-3'
));

$values = $place_holders = array();

if(count($data_to_be_inserted) > 0) {
    foreach($data_to_be_inserted as $data) {
        array_push( $values, $data['option_name'], $data['option_value'], $data['option_created'], $data['option_edit'], $data['option_user']);
        $place_holders[] = "( %s, %s, %s, %s, %s)";
    }

    do_insert( $place_holders, $values );
}
8 feb 2019 07:26:36
0

Se me ocurrió esta solución que extiende la clase wpdb para que utilice sus funciones internas de procesamiento de datos:

<?php
class wpdbx extends wpdb {
  public function __construct() {
    parent::__construct(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
  }

  public function insert_multiple($table, $data, $format = null) {
    $this->insert_id = 0;

    $formats = array();
    $values = array();

    foreach ($data as $index => $row) {
      $row = $this->process_fields($table, $row, $format);
      $row_formats = array();

      if ($row === false || array_keys($data[$index]) !== array_keys($data[0])) {
        continue;
      }

      foreach($row as $col => $value) {
        if (is_null($value['value'])) {
          $row_formats[] = 'NULL';
        } else {
          $row_formats[] = $value['format'];
        }

        $values[] = $value['value'];
      }

      $formats[] = '(' . implode(', ', $row_formats) . ')';
    }

    $fields  = '`' . implode('`, `', array_keys($data[0])) . '`';
    $formats = implode(', ', $formats);
    $sql = "INSERT INTO `$table` ($fields) VALUES $formats";

    $this->check_current_query = false;
    return $this->query($this->prepare($sql, $values));
  }
}

global $wpdbx;
$wpdbx = new wpdbx();
?>

Luego puedes usarlo así:

<?php
global $wpdbx;
$results = $wpdbx->insert_multiple(
  'settings-table',
  array(
    array(
      'option_name'   => 'nombre-1', 
      'option_value'  => 'valor-1', 
      'option_created'=> current_time('mysql'),
      'option_edit'   => current_time('mysql'),
      'option_user'   => 'usuario-1' 
    ),
    array(
      'option_name'   => 'nombre-2', 
      'option_value'  => 'valor-2', 
      'option_created'=> current_time('mysql'),
      'option_edit'   => current_time('mysql'),
      'option_user'   => 'usuario-2' 
    ),
    array(
      'option_name'   => 'nombre-1', 
      'option_value'  => 'valor-3', 
      'option_created'=> current_time('mysql'),
      'option_edit'   => current_time('mysql'),
      'option_user'   => 'usuario-3'
    )
  )
);
?>
5 ago 2021 19:24:07
1

Esto También Funcionará

        $nameArray = array("name-1", "name-2", "name-3");
        $valueArray = array("val-1", "val-2" , "val-3");
        $userArray = array("user-1" , "user-2", "user-3");
        $maxRow= count($nameArray); // se puede usar el count de cualquier array
        $setting_values = array();
        $time = current_time('mysql');

        for($x=0;$x<$maxRow; $x++){
            $SettingContext = [
                'option_name' => "'" . $nameArray[$x] . "'",
                'option_value' => "'" . $valueArray[$x] . "'",
                'option_created' => "'" . $time . "'",
                'option_edit' => "'" . $time . "'",
                'option_user' => "'" . $userArray[$x] . "'"
            ];
            $setting_values[] = "(" . implode(',', $SettingContext) . ")";
        }
        $settingSubmit = implode(',', $setting_values);
        $setting_save = $wpdb->query("
                INSERT INTO setting
                (option_name, option_value, option_created,option_edit, option_user)
                VALUES " . $settingSubmit
        );
7 mar 2019 14:11:50
Comentarios

He probado el código anterior y aunque insertó en la tabla, lo hizo en una sola fila. ¿Cómo se hace para que inserte en filas separadas? He intentado de todo y no logro que funcione

Ian Young Ian Young
15 nov 2024 17:17:19