【问题标题】:PHP Warning: Missing argument 2 for wpdb::prepare() WPML PluginPHP 警告:wpdb::prepare() WPML 插件缺少参数 2
【发布时间】:2014-01-28 15:49:57
【问题描述】:

我的 wordpress 项目的特定后端页面突然出现错误:

警告:wpdb::prepare() 缺少参数 2,在第 463 行的 .../wp-content/plugins/wpml-media/inc/wpml_media.class.php 中调用并在 .. ./wp-includes/wp-db.php 在第 992 行

应该是:

wpml_media.class.php

// get language of their parents
if(!empty($missing_langs)){     
    $results = $wpdb->get_results($wpdb->prepare("
        SELECT p.ID, t.language_code 
        FROM {$wpdb->posts} p JOIN {$wpdb->prefix}icl_translations t ON p.ID = t.element_id AND t.element_type = CONCAT('post_', p.post_type)
        WHERE p.ID IN(".join(',', $missing_langs).")
    "));
    foreach($results as $row){
        $parent_langs[$row->ID] = $row->language_code;
    }
}

wp-db.php

function prepare( $query, $args ) {
    if ( is_null( $query ) )
        return;

    $args = func_get_args();
    array_shift( $args );
    // If args were passed as an array (as in vsprintf), move them up
    if ( isset( $args[0] ) && is_array($args[0]) )
        $args = $args[0];
    $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
    $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
    $query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
    $query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
    array_walk( $args, array( $this, 'escape_by_ref' ) );
    return @vsprintf( $query, $args );
}

我不知道这里发生了什么,有什么想法吗?不幸的是,作者的支持已过期。

谢谢

【问题讨论】:

    标签: php wordpress plugins warnings wpml


    【解决方案1】:

    $wpdb-&gt;prepare 至少需要两个参数http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

    试试这样的:

    $wpdb->prepare("
            SELECT p.ID, t.language_code 
            FROM {$wpdb->posts} p JOIN {$wpdb->prefix}icl_translations t ON p.ID = t.element_id AND t.element_type = CONCAT('post_', p.post_type)
            WHERE p.ID IN(%s)", join(',', $missing_langs))
    

    【讨论】:

      【解决方案2】:

      关于这个问题的更多信息here。基本上,不要惊慌,因为这只是一个警告,所以没有什么会真正破坏。

      如果您希望修改 wpml-media 插件以消除此错误,上述链接中的开发人员信息应该会有所帮助。如果您只是想让警告消失,那么我引用:

      首先,如果您是用户并且想要摆脱这些错误,您应该关闭 PHP 中的错误显示。有很多方法可以做到这一点,例如在 php.ini、.htaccess 等中。为此,您可以将其放在 wp-config.php 中。 (请注意,在生产站点上隐藏错误无论如何都是一种好习惯。)

      @ini_set('display_errors', 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        相关资源
        最近更新 更多