web-dev-qa-db-de.com

Wordpress $ wpdb. Mehrere Datensätze einfügen

Gibt es eine Möglichkeit, das Folgende in Wordpress mit $wpdb->insert oder zu erreichen?

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

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

...usw

26
djt

OK, ich habe es herausgefunden!

Richten Sie Arrays für tatsächliche Werte und Platzhalter ein

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

die anfängliche Abfrage:

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

Führen Sie dann die Werte durch, die Sie hinzufügen möchten, und fügen Sie sie in die entsprechenden Arrays ein:

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 */
}

Fügen Sie dann diese Bits der ersten Abfrage hinzu:

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

Sie können diese Methode auch zum Erstellen der Abfrage verwenden:

$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 );
15
Philipp

Ich bin auf dieses Problem gestoßen und habe mich entschlossen, eine verbesserte Funktion zu entwickeln, indem auch die akzeptierte Antwort verwendet wird:

/**
 * 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;
    }

}

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

5
motto

Zusätzlich zum Einfügen mehrerer Zeilen mit $ wpdb sollte es hilfreich sein, vorhandene Zeilen nach dem Snippet zu aktualisieren. Dies ist ein aktualisierter Snippet der Informationen, die mein Freund @philipp oben bereitgestellt hat.

$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)";
0
sven