Support » Plugin: Select Featured Posts » 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?

    http://wordpress.org/extend/plugins/select-featured-posts/

Viewing 15 replies - 1 through 15 (of 60 total)
  • Drew Jaynes

    (@drewapicture)

    WordPress Core Developer

    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.wordpress.org/changeset/22429

    Moderator Andrew Nacin

    (@nacin)

    Lead Developer

    If you’re a user: Your site is fine. If you’re a plugin/theme author, please read: http://make.wordpress.org/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.

    Drew Jaynes

    (@drewapicture)

    WordPress Core Developer

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

    Ed

    (@erjenkins1)

    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

Viewing 15 replies - 1 through 15 (of 60 total)
  • The topic ‘Error with WP 3.5: wpdb::prepare()’ is closed to new replies.