php WordPress $wpdb。插入多条记录

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12373903/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 03:26:06  来源:igfitidea点击:

Wordpress $wpdb. Insert Multiple Records

phpmysqlwordpress

提问by djt

Is there any way to accomplish the following in Wordpress with $wpdb->insertor

有什么方法可以在 Wordpress 中使用$wpdb->insert或完成以下操作

$wpdb->query($wpdb->prepare)):

$wpdb->query($wpdb->prepare))

INSERT into TABLE (column1, column2, column3) 
VALUES
('value1', 'value2', 'value3'),
('otherval1', 'otherval2', 'otherval3'),
('anotherval1', 'anotherval2', 'anotherval3')

...etc

...等等

回答by djt

OK, I figured it out!

好的,我想通了!

Setup arrays for Actual Values, and Placeholders

为实际值和占位符设置数组

$values = array();
$place_holders = array();

the initial Query:

初始查询:

$query = "INSERT INTO orders (order_id, product_id, quantity) VALUES ";

Then loop through the the values you're looking to add, and insert them in the appropriate arrays:

然后遍历您要添加的值,并将它们插入适当的数组中:

foreach ( $_POST as $key => $value ) {
     array_push( $values, $value, $order_id );
     $place_holders[] = "('%d', '%d')" /* In my case, i know they will always be integers */
}

Then add these bits to the initial query:

然后将这些位添加到初始查询中:

$query .= implode( ', ', $place_holders );
$wpdb->query( $wpdb->prepare( "$query ", $values ) );

回答by Philipp

You can also use this way to build the query:

您也可以使用这种方式来构建查询:

$values = array();

// We're preparing each DB item on it's own. Makes the code cleaner.
foreach ( $items as $key => $value ) {
    $values[] = $wpdb->prepare( "(%d,%d)", $key, $value );
}

$query = "INSERT INTO orders (order_id, product_id, quantity) VALUES ";
$query .= implode( ",\n", $values );

回答by mirza

I have came across with this problem and decided to build a more improved function by using accepted answer too:

我遇到了这个问题,并决定通过使用接受的答案来构建一个更加改进的功能:

/**
 * A method for inserting multiple rows into the specified table
 * 
 *  Usage Example: 
 *
 *  $insert_arrays = array();
 *  foreach($assets as $asset) {
 *
 *  $insert_arrays[] = array(
 *  'type' => "multiple_row_insert",
 *  'status' => 1,
 *  'name'=>$asset,
 *  'added_date' => current_time( 'mysql' ),
 *  'last_update' => current_time( 'mysql' ));
 *
 *  }
 *
 *  wp_insert_rows($insert_arrays);
 *
 *
 * @param array $row_arrays
 * @param string $wp_table_name
 * @return false|int
 *
 * @author  Ugur Mirza ZEYREK
 * @source http://stackoverflow.com/a/12374838/1194797
 */

function wp_insert_rows($row_arrays = array(), $wp_table_name) {
    global $wpdb;
    $wp_table_name = esc_sql($wp_table_name);
    // Setup arrays for Actual Values, and Placeholders
    $values = array();
    $place_holders = array();
    $query = "";
    $query_columns = "";

    $query .= "INSERT INTO {$wp_table_name} (";

            foreach($row_arrays as $count => $row_array)
            {

                foreach($row_array as $key => $value) {

                    if($count == 0) {
                        if($query_columns) {
                        $query_columns .= ",".$key."";
                        } else {
                        $query_columns .= "".$key."";
                        }
                    }

                    $values[] =  $value;

                    if(is_numeric($value)) {
                        if(isset($place_holders[$count])) {
                        $place_holders[$count] .= ", '%d'";
                        } else {
                        $place_holders[$count] .= "( '%d'";
                        }
                    } else {
                        if(isset($place_holders[$count])) {
                        $place_holders[$count] .= ", '%s'";
                        } else {
                        $place_holders[$count] .= "( '%s'";
                        }
                    }
                }
                        // mind closing the GAP
                        $place_holders[$count] .= ")";
            }

    $query .= " $query_columns ) VALUES ";

    $query .= implode(', ', $place_holders);

    if($wpdb->query($wpdb->prepare($query, $values))){
        return true;
    } else {
        return false;
    }

}

Source: https://github.com/mirzazeyrek/wp-multiple-insert

来源:https: //github.com/mirzazeyrek/wp-multiple-insert

回答by sven

In addition to inserting multiple rows using $wpdb, if you ever need to update existing rows following snippet should be helpful. This is updated snippet of what my friend @philippprovided above.

除了使用 $wpdb 插入多行之外,如果您需要更新以下代码段的现有行应该会有所帮助。这是我的朋友@philipp上面提供的更新片段。

$values = array();

// We're preparing each DB item on it's own. Makes the code cleaner.
foreach ( $items as $key => $value ) {
    $values[] = $wpdb->prepare( "(%d,%d)", $key, $value );
}

$values = implode( ",\n", $values );
$query = "INSERT INTO orders (order_id, product_id, quantity) VALUES {$values} ON DUPLICATE KEY UPDATE `quantity` = VALUES(quantity)";

回答by Wervada

This is a bit late, but you could also do it like this.

这有点晚了,但你也可以这样做。

    global $wpdb;
    $table_name = $wpdb->prefix . 'your_table';

    foreach ($your_array as $key => $value) {
          $result = $wpdb->insert( 
            $table_name, 
            array( 
              'colname_1' => $value[0], 
              'colname_2' => $value[1], 
              'colname_3' => $value[2], 
            ) 
          );
        }
  if (!$result) {
    print 'There was a error';
  }

回答by gion

not very nice, but if you know what you are doing:

不是很好,但如果你知道你在做什么:

require_once('wp-load.php');
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);  
@mysql_select_db(DB_NAME) or die();
mysql_query("INSERT into TABLE ('column1', 'column2', 'column3') VALUES 
                               ('value1', 'value2', 'value3'), 
                               ('otherval1', 'otherval2', 'otherval3'),
                               ('anotherval1', 'anotherval2', 'anotherval3)");