web-dev-qa-db-ja.com

Wordpress 3.5で警告を発するStackoverflowタイプのバッジプラグイン

放棄されたStackoverflow形式のバッジプラグインをWordpress 3.4.2で動作するように修正しましたが、実際には機能します。そのための完全なスクリプトはこちらです: http://Pastebin.com/Ta91zXiL

Wordpress v3.5にアップグレードすると、投稿を公開するとき(またはコメントを投稿するとき)、次のような警告が表示されます。

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

つまり、342行目と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;
}

私はこれらの警告を一日中理解しようとしましたが失敗しました。 WP 3.5用のこの非常に便利なバッジシステムの実用版を入手できるように、誰かがこの問題を解決するのを手伝ってくれる?

2

主任開発者Nacinがこれに答えます

こんにちはプラグインやテーマの作者!インターネット上で上記のエラーを検索した後、この投稿を見つけた可能性があります:“ PHP Warning:wpdb :: prepare()の引数2が見つかりません。”

そのため、これは3.5の新しい警告です。サイトが壊れていない、すべてが以前と同じように問題ありません。しかし、これは確かにあなたが見なければならない何かです、あなたは潜在的なSQLインジェクションの脆弱性にあなたのユーザーをさらすかもしれないので。今それは楽しいことではありません!

さらなる説明のために、残りを読んでください。

既存のコードを修復することに関して:

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

まず、不要な文字列の連結を取り除き、コメントテーブルのために$wpdb->commentsを呼び出すことでそれを片付けます。

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

さて、警告はクエリのこの部分に関係しています。

WHERE   user_id = $args['user_ID']

$args['user_ID']$dに置き換えてから、不足している2番目のパラメーターとして$args['user_ID']を使用する必要があります。

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

2番目のものは似ているはずです:

$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