web-dev-qa-db-fra.com

Type de plug-in de badge Stackoverflow donnant des avertissements dans Wordpress 3.5

J'ai modifié une forme de plug-in de badge Stackoverflow abandonnée pour fonctionner avec Wordpress 3.4.2 et c'est effectivement le cas. Le script complet pour cela est ici: http://Pastebin.com/Ta91zXiL

Lors de la mise à niveau vers Wordpress v3.5, je reçois ces avertissements lors de la publication d'un message (ou d'un commentaire):

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 342 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 342 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 342 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 355 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 355 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 342 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 342 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 342 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 355 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Missing argument 2 for wpdb::prepare(), called in /public_html/wp-content/plugins/rockhoist-badges/rh-badges.php on line 355 and defined in /public_html/wp-includes/wp-db.php on line 990

Warning: Cannot modify header information - headers already sent by (output started at /public_html/wp-includes/wp-db.php:990) in /public_html/wp-includes/pluggable.php on line 876

Cela semble donc être lié aux lignes 342 et 355:

function rhb_get_user_comment_count( $args = '' ) {

        global $wpdb;

        $comment_count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(*)
                FROM " . $wpdb->prefix . "comments
                WHERE user_id = " . $args['user_ID'] . "
                AND comment_approved = '1'" ) ); // line 342

        return $comment_count;
}

function rhb_get_user_post_count( $args = '' ) {

        global $wpdb;

        $post_count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(*)
                FROM " . $wpdb->prefix . "posts
                WHERE post_author = " . $args['user_ID'] . "
                AND post_status = 'publish'
                AND post_type = 'post'" ) ); // line 355

        return $post_count;
}

J'ai essayé de comprendre ces avertissements toute la journée, mais j'ai échoué. Quelqu'un peut-il m'aider à résoudre ce problème afin que nous puissions disposer d'une version fonctionnelle de ce système de badge très utile pour WP 3.5?

2
Christine Cooper

Le développeur en chef Nacin répond à cette question :

Bonjour plugin ou auteur du thème! Vous avez probablement trouvé ce message après avoir recherché sur Internet l'erreur ci-dessus: “Avertissement PHP: Argument 2 manquant pour wpdb :: prepare ().”

Donc, ceci est un nouvel avertissement dans 3.5. Aucun site n'est en panne, tout va bien comme avant. Mais c’est effectivement quelque chose que vous devez examiner, car vous exposez peut-être vos utilisateurs à une vulnérabilité possible à l’injection SQL. Maintenant ce n’est pas amusant!

Lisez le reste pour plus d'explications.

En ce qui concerne la réhabilitation de votre code existant:

$wpdb->prepare( 
    "
    SELECT COUNT(*)
    FROM " . $wpdb->prefix . "comments
    WHERE user_id = " . $args['user_ID'] . "
    AND comment_approved = '1'
    " 
)

Commencez par le nettoyer en supprimant la concaténation inutile des chaînes et en appelant $wpdb->comments pour le tableau de commentaires:

$wpdb->prepare( 
    "
    SELECT  COUNT(*)
    FROM    $wpdb->comments
    WHERE   user_id = $args['user_ID']
    AND     comment_approved = '1'
    " 
)

Maintenant, l'avertissement concerne cette partie de la requête:

WHERE   user_id = $args['user_ID']

Vous devez remplacer $args['user_ID'] par $d, puis utiliser $args['user_ID'] comme deuxième paramètre manquant:

$wpdb->prepare( 
    "
    SELECT  COUNT(*)
    FROM    $wpdb->comments
    WHERE   user_id = %d
    AND     comment_approved = '1'
    ",
    $args['user_ID'] // %d
)

Le second devrait être similaire:

$wpdb->prepare( 
    "
    SELECT    COUNT(*)
    FROM      $wpdb->posts
    WHERE     post_author = %d
    AND       post_status = 'publish'
    AND       post_type = 'post'
    ",
    $args['user_ID'] // %d
)
7
Chip Bennett