web-dev-qa-db-fra.com

Wordpress $ wpdb. Insérer plusieurs enregistrements

Est-il possible d'accomplir ce qui suit dans Wordpress avec $wpdb->insert ou 

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

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

...etc

26
djt

OK, je l'ai compris!

Configurer des matrices pour les valeurs réelles et les espaces réservés

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

la requête initiale:

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

Parcourez ensuite les valeurs que vous souhaitez ajouter et insérez-les dans les tableaux appropriés:

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

Ajoutez ensuite ces bits à la requête initiale:

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

Vous pouvez également utiliser cette méthode pour construire la requête:

$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

J'ai rencontré ce problème et décidé de créer une fonction plus améliorée en utilisant également la réponse acceptée:

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

5
motto

Outre l'insertion de plusieurs lignes à l'aide de $ wpdb, il peut être utile, le cas échéant, de mettre à jour des lignes existantes après l'extrait de code . Il s'agit de l'extrait de code de ce que mon ami @philipp a fourni ci-dessus.

$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