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
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));
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 );
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;
}
}
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)";