The question:
This works:
$values = array();
foreach ( $_POST as $key => $value ) {
$values[] = $wpdb->prepare( "(%d,%s,%s)", $post_id, $key, $value );
}
$query = "INSERT INTO {$table} (post_id, meta_key, meta_value) VALUES ";
$query .= implode( ",n", $values );
$wpdb->query( $wpdb->prepare( "$query", $values ) );
But it throws this notice:
PHP Notice: wpdb::prepare was called incorrectly.
The query does not contain the correct number of placeholders (0) for
the number of arguments passed (3).
How can I avoid the Notice?
The Solutions:
Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.
Method 1
Well, you don’t need the second $wpdb->prepare()
and just do $wpdb->query( $query );
. The reason is because the $query
does not contain any placeholders just as stated in the notice; only the items in $values
contain the placeholders, but you already prepared them in the foreach
. Additionally, be sure to run the query()
only if the array $values
is not empty.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0