Error with WP 3.5: wpdb::prepare()
-
Seems like this is a pretty common error with the new wp 3.5 release, but getting a “Missing argument 2 for wpdb::prepare() on line 75” error in the Posts page for the plugin after upgrade. It still seems to function ok for already selected posts on the front-end, but the error prevents selecting of any new posts.
Assuming we wont be getting an upgrade since it hasn’t been updated in over 2 years but though someone here might have a fix?
-
This is due to
wpdb::prepare()requiring a minimum of 2 arguments as of 3.5. Plugin/theme authors should be referred to this changeset: https://core.trac.ww.wp.xz.cn/changeset/22429If you’re a user: Your site is fine. If you’re a plugin/theme author, please read: http://make.ww.wp.xz.cn/core/2012/12/12/php-warning-missing-argument-2-for-wpdb-prepare/. If you’re a user, please point your plugin/theme author to that post.
I’m sorry but I’m not a developer and am having a hard time applying these fixes to this plugin. Looking at the referenced lines in the error this is what is currently there:
<?php global $wpdb, $post; $checked = ''; if ($post->post_status == 'publish' && $post->post_password == '' && $post->post_type == 'post') { $res = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM $wpdb->featured_posts WHERE post_id = $post_id")); if ($res) { $checked = 'checked="true"'; } else { $checked = ''; } ?>I see the wpdb->prepare argument but not sure what I need to change it to.
Replace this:
$wpdb->get_var($wpdb->prepare("SELECT post_id FROM $wpdb->featured_posts WHERE post_id = $post_id"));With this:
$wpdb->get_var($wpdb->prepare( "SELECT post_id FROM $wpdb->featured_posts WHERE post_id = %d", $post_id ));That worked, but now I’m getting a new error on a new line. Code appears to be:
if ($action_delete == 1) { $success = $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->featured_posts WHERE post_id = $post_id ")); } else { $success = $wpdb->insert($wpdb->featured_posts, array( 'post_id' => $post_id, 'created' => time() ), array( '%d', '%d' ) ); }I can change the one line to:
$success = $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->featured_posts WHERE post_id = $d ", $post_id ));That seems to work, but I get an error of “There was some error while updating.Please try again” when unchecking featured posts, so I assume some change needs to be made to the other wpdb line.
purrdesign –
It should be like this I believe:$success = $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->featured_posts WHERE post_id = %d ",$post_id));The $d needs to be a %d in order for the variable to be replaced just like Drew did otherwise your code looks correct.
How can I change this?
$postids = $wpdb->get_col( $wpdb->prepare( " SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' " ) );Anyone can help me edit this line,please.
$tax_array = $wpdb->get_results($wpdb->prepare($sql));Can someone help with this line, generating the same error:
$th_vers = $wpdb->get_var( $wpdb->prepare( "SELECT th_vers FROM $table WHERE id = 1 LIMIT 0,1" ) );Hey everyone, I’m having the same problem…
The Warning:
“Warning: Missing argument 2 for wpdb::prepare(), called in /home/hubdc/hubdconline.org/wp-content/themes/brainstorm/functions/sidebars.php on line 70 and defined in /home/hubdc/hubdconline.org/wp-includes/wp-db.php on line 990”The Referenced line of code
$widgetized_pages = $wpdb->get_col($wpdb->prepare(“SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = ‘jw_sidebar'”));I’m also not a developer… any ideas??
Hi everyone!
In case some people are still wondering how to change the code to properly pass 2 arguments to prepare(), here is an example:
//OLD: $wpdb->prepare( "SELECT * FROM some_table WHERE ID = $id AND name = $name" ); //NEW: $wpdb->prepare( "SELECT * FROM some_table WHERE ID = %d AND name = %s", $id, $name );%d for integers, %s for strings, %f for floats.
The line of code posted by AlanCWebb would be changed the following way:
//OLD $widgetized_pages = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = 'jw_sidebar'")); //NEW $jw_sidebar = 'jw_sidebar'; $widgetized_pages = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s",$jw_sidebar));Hope, it helps someone.
Regards,
Alex@alexrayan, I owe you a beer. Thanks so much!
need help here for a plugin that has no more support from author, gurus please assist..
$sql = $this->db->prepare( “SELECT * FROM {$this->popover} WHERE popover_active = 1 ORDER BY popover_order ASC” );
and.. one more syntax error..
<?php if (function_exists(‘dynamic_sidebar’) && dynamic_sidebar(‘Footer Column 1’)){};?>
pls help… thanks
Hi Shadowspid!
Regarding the first piece of code, you would need to move the property out of the query and into a variable before it, then pass the variable as a second argument to the function:
$popover = $this->popover; $sql = $this->db->prepare( "SELECT * FROM %s WHERE popover_active = 1 ORDER BY popover_order ASC", $popover );Regarding the second piece of code, it’s unclear what the problem is. What errors are you getting with it?
Regards,
Alex
The topic ‘Error with WP 3.5: wpdb::prepare()’ is closed to new replies.