wpdb->insert înregistrări multiple simultan
După ce am creat tabelul 'settings-table' vreau să adaug mai multe înregistrări în el.
Aceasta este modalitatea în care vreau să o fac, nu este cea mai bună metodă, așa că am nevoie de o variantă mai bună deoarece voi adăuga mai multe înregistrări în tabel.
EXEMPLUL 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'
ACTUALIZARE
Această variantă funcționează (orice alte soluții mai bune sunt binevenite)
$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')")
În interogarea pe care ai postat-o, numele coloanelor nu ar trebui să fie în ghilimele.

$wpdb->insert nu acceptă inserarea mai multor înregistrări într-un singur apel de funcție. Trebuie să parcurgem datele și să le pregătim pentru inserare, apoi să folosim $wpdb->insert într-o buclă pentru a insera înregistrările una câte una.
În schimb, putem pregăti o interogare de inserare așa cum urmează și să executăm interogarea o singură dată.
Deci, dacă vrem să inserăm 100 de înregistrări, trebuie să rulăm 100 de interogări de inserare dacă folosim $wpdb->insert. Iar dacă folosim codul de mai jos, trebuie să rulăm doar 1 interogare de inserare.
Sper că acest lucru vă ajută.
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 );
}

Am creat această soluție care extinde clasa wpdb
pentru a utiliza funcțiile sale interne de procesare a datelor:
<?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();
?>
Poți folosi această clasă în felul următor:
<?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'
)
)
);
?>

Aceasta va funcționa de asemenea
$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 poate folosi count pentru orice 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
);
