wpdb->insert inserimento multiplo di record contemporaneamente

3 mar 2014, 16:15:20
Visualizzazioni: 36.6K
Voti: 12

Dopo aver creato la tabella 'settings-table' voglio aggiungere diversi record contemporaneamente.

Questo è il modo in cui lo sto facendo, non è il migliore, quindi ho bisogno di un metodo più efficiente poiché dovrò aggiungere altri record alla tabella.

ESEMPIO 1

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

AGGIORNAMENTO

Questa soluzione funziona (altri suggerimenti per soluzioni migliori sono benvenuti)

$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')")
6
Commenti

A cosa servono queste impostazioni? Dovresti considerare l'uso della tabella options (con tutta la funzionalità di WP che esiste per essa), oppure postmeta o usermeta (di nuovo, con tutte le funzionalità WP che già esistono intorno a loro). Infine: se vuoi usare la tua tabella, probabilmente un ciclo ti darebbe ciò che cerchi, ma avremmo bisogno di maggior contesto, capire cosa stai cercando di ottenere nel "quadro generale"

random_user_name random_user_name
3 mar 2014 17:04:05

L'esempio sopra è solo un esempio, non voglio usare la tabella wp-options. Non posso dare più informazioni perché non ce ne sono, è molto basilare, ho solo bisogno di aggiungere più record all'interno della tabella.

user759235 user759235
3 mar 2014 17:11:38

l'uso di prepare non è corretto, il che probabilmente genererà un warning. vedi il codex per il formato corretto.

Milo Milo
3 mar 2014 17:44:32

Sì l'ho visto, l'ho modificato, ma ho ancora bisogno di un modo per aggiungere più record alla tabella

user759235 user759235
3 mar 2014 17:53:49

Puoi fornire maggiori informazioni. Che tipo di record stai inserendo? Come vengono generati i record? Ancora una volta, un ciclo probabilmente ti fornirebbe ciò di cui hai bisogno, ma senza ulteriore contesto è difficile fornire una risposta utile. FYI, potresti usare un semplice $wpdb->query() con un insieme di valori di inserimento costruiti manualmente per inserire più righe contemporaneamente...

random_user_name random_user_name
3 mar 2014 18:03:29

L'ho risolto usando $wpdb->query().

user759235 user759235
3 mar 2014 18:06:50
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 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')")

Nella query che hai pubblicato, i nomi delle colonne non dovrebbero essere tra virgolette.

25 giu 2014 05:23:02
0

$wpdb->insert non supporta l'inserimento di più record con una singola chiamata alla funzione. È necessario iterare sui dati, prepararli per l'inserimento e poi utilizzare $wpdb->insert all'interno di un ciclo per inserire i record uno alla volta.

In alternativa, possiamo preparare una query di inserimento come segue ed eseguirla una sola volta.

Quindi, se vogliamo inserire 100 record, dovremo eseguire 100 query di inserimento se utilizziamo $wpdb->insert. Se invece usiamo il seguente codice, eseguiremo solo 1 query di inserimento.

Spero che questo sia d'aiuto.

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

Ho ideato questa soluzione che estende la classe wpdb in modo che utilizzi le sue funzioni interne di elaborazione dei dati:

<?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();
?>

Puoi quindi utilizzarla in questo modo:

<?php
global $wpdbx;
$results = $wpdbx->insert_multiple(
  'settings-table',
  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'
    )
  )
);
?>
5 ago 2021 19:24:07
1

Questo Funzionerà Anche

        $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); // si può usare il conteggio di qualsiasi 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
Commenti

Ho provato il codice sopra e sebbene abbia inserito i dati nella tabella, lo ha fatto in una sola riga. Come si fa a inserirli in righe separate? Ho provato di tutto ma non riesco a farlo funzionare

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