wpdb->insert înregistrări multiple simultan

3 mar. 2014, 16:15:20
Vizualizări: 36.6K
Voturi: 12

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

Pentru ce sunt aceste setări? Ar trebui să iei în considerare folosirea tabelei options (cu toată funcționalitatea WP care există pentru ea), sau postmeta sau usermeta (din nou, cu toată funcționalitatea WP care există deja pentru ele). În final: dacă vrei să folosești propriul tabel, o buclă ar putea oferi ceea ce cauți, dar ar trebui să avem mai mult context, să înțelegem ce încerci să realizezi în ansamblu.

random_user_name random_user_name
3 mar. 2014 17:04:05

Exemplul de mai sus este doar un exemplu, nu vreau să folosesc tabela wp-options. Nu pot oferi mai multe informații deoarece nu există, este foarte simplu, trebuie doar să adaug mai multe înregistrări în interiorul tabelului.

user759235 user759235
3 mar. 2014 17:11:38

folosirea lui prepare este incorectă, ceea ce ar genera probabil un avertisment. vezi codex-ul pentru formatul corect.

Milo Milo
3 mar. 2014 17:44:32

Da, l-am văzut, l-am modificat, dar tot am nevoie de o modalitate de a adăuga mai multe înregistrări în tabel

user759235 user759235
3 mar. 2014 17:53:49

Poți oferi mai multe informații. Ce fel de înregistrări inserezi? Cum sunt generate înregistrările? Din nou, probabil că o buclă te-ar putea ajuta, dar fără mai mult context, este dificil să ofer un răspuns util. Apropo, ai putea folosi un simplu $wpdb->query() cu un set de valori de inserare construit manual pentru a insera mai multe rânduri deodată...

random_user_name random_user_name
3 mar. 2014 18:03:29

Am rezolvat folosind $wpdb->query().

user759235 user759235
3 mar. 2014 18:06:50
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 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')")

În interogarea pe care ai postat-o, numele coloanelor nu ar trebui să fie în ghilimele.

25 iun. 2014 05:23:02
0

$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 );
}
8 feb. 2019 07:26:36
0

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'
    )
  )
);
?>
5 aug. 2021 19:24:07
1

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
        );
7 mar. 2019 14:11:50
Comentarii

Am încercat codul de mai sus și deși a inserat în tabel, a făcut-o într-un singur rând. Cum se poate face să insereze în rânduri separate? Am încercat diverse metode și nu reușesc să funcționeze

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