Tipo de plug-in del complemento de la insignia que emite advertencias en Wordpress 3.5

2

He modificado una forma abandonada de Stackoverflow del complemento de distintivo para que funcione con Wordpress 3.4.2 y de hecho lo hace. El script completo está aquí: enlace

Al actualizar a Wordpress v3.5, recibo estas advertencias al publicar una publicación (o publicar un comentario):

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

Parece estar relacionado con las líneas 342 y 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;
}

He intentado entender estas advertencias todo el día, pero he fallado. ¿Puede alguien amablemente ayudarme a solucionar este problema para que podamos tener una versión funcional de este sistema de identificación muy útil para WP 3.5?

    
pregunta Christine Cooper 18.12.2012 - 18:08

1 respuesta

7

El desarrollador líder Nacin responde a esta :

  

Hola plugin o autor del tema! Posiblemente encontraste este post después   buscando en Internet el error anterior: "Advertencia de PHP: faltante   argumento 2 para wpdb :: prepare (). "

     

Entonces, esta es una nueva advertencia en 3.5. No hay sitios rotos, todo está   bien como antes Pero, esto es de hecho algo que necesitas mirar,   Debido a que puede estar exponiendo a sus usuarios a una posible inyección de SQL   vulnerabilidad. ¡Eso no es divertido!

Lea el resto para una explicación más detallada.

En cuanto a la rehabilitación de su código existente:

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

Primero, límpielo eliminando la concatenación de cadenas innecesaria y llamando a $wpdb->comments para la tabla de comentarios:

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

Ahora, la advertencia tiene que ver con esta parte de la consulta:

WHERE   user_id = $args['user_ID']

Necesitas reemplazar $args['user_ID'] con $d , y luego usar $args['user_ID'] como el segundo parámetro faltante:

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

El segundo debe ser similar:

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

Lea otras preguntas en las etiquetas