WordPress $wpdb. Insert Multiple Records

Is there any way to accomplish the following in WordPress with $wpdb->insert or

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

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

…etc

Related posts

Leave a Reply

6 comments

  1. 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 ) );
    
  2. 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 );
    
  3. 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

  4. 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 @philipp provided above.

    $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)";
    
  5. 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';
      }
    
  6. 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)");