警告通知$wpdb->准备传递的参数数目不正确

时间:2017-12-12 作者:Benjamin

我在尝试使用$wpdb->prepare函数时收到此通知:

注意:调用了wpdb::prepareincorrectly. 查询中传递的参数数(4)的占位符数(7)不正确。有关详细信息,请参阅WordPress中的调试。(此消息是在版本4.8.3中添加的。)在C:\\wamp\\www\\wpml\\wp includes\\函数中。php在线4139

我查看了关于这个主题的其他帖子,在我的代码中没有看到这些线程中有任何相同的问题。开发此通知时,会大大降低我的应用程序的速度,因此我想找到一个解决方案。

function get_meta_range($meta_key) {
    global $wpdb;

    // $meta_key = \'_price\'
    $include = \'7275,7266,7256,7237,7196,7192,7164\';

    $min = floor( $wpdb->get_var(
        $wpdb->prepare(\'
            SELECT min(meta_value + 0)
            FROM %1$s
            LEFT JOIN %2$s ON %1$s.ID = %2$s.post_id
            WHERE ( meta_key =\\\'%3$s\\\' OR meta_key =\\\'%4$s\\\' )
            AND meta_value != ""
            AND (
                %1$s.ID IN (\' . $include . \')
            )\'
        , $wpdb->posts, $wpdb->postmeta, $meta_key, \'_min_variation\' . $meta_key )
    ) );

    // $min = 15
}

2 个回复
SO网友:Milo

带编号的占位符不能像您预期的那样工作,并且在将来的某个时候会被完全删除,因此应将其视为无效语法。

因此,考虑到这一点,错误描述了问题-您的查询有7个占位符,但您只传递了4个值。对于重复的值,只需在传递替换的位置重复它们。

SO网友:Tom J Nowell

这个wpdb::prepare 表示不应引用占位符,但在代码中有:

WHERE ( meta_key =\\\'%3$s\\\' OR meta_key =\\\'%4$s\\\' )
还要记住,当您已经知道post ID时,meta表的设计速度是很快的,而当您获取一篇文章时,WP已经获取了所有的meta。

所以实际上使用起来要快得多get_post_meta 并在PHP中进行计算,因为已经请求了数据。执行此查询既不必要,也可能代价高昂

结束