wpdb->insert inserimento multiplo di record contemporaneamente
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')")
$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.

$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 );
}

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

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