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