突然间,我在wordpress项目的特定后端页面上收到错误:
警告:缺少wpdb :: prepare()的参数2,在第463行的... / wp-content / plugins / wpml-media / inc / wpml_media.class.php中调用并在..中定义第992行./wp-includes/wp-db.php
这将是:
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 );
}
我不知道这里发生了什么,有什么想法吗?不幸的是,作者的支持已经过期了。
由于
答案 0 :(得分:2)
$wpdb->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))
答案 1 :(得分:1)
有关此问题here的更多信息。基本上,不要惊慌,因为它只是一个警告,所以什么都不会真正破坏。
如果您希望修改wpml-media插件以消除此错误,则上述链接中的开发人员信息应该有所帮助。如果您只是希望警告消失,那么我引用:
首先,如果您是用户并且想要摆脱这些错误,则应该关闭PHP中错误的显示。有很多方法可以做到这一点,比如php.ini,.htaccess等。为此,你可以把它放在wp-config.php中。 (请注意,无论如何,隐藏生产网站上的错误都是很好的做法。)
@ini_set('display_errors', 0);