为Foreach()提供的参数无效

时间:2020-08-06 作者:Zed93

我尝试从请求中获取一些值并在循环中显示它。我已经在另一个函数中使用了这个系统,它工作正常,但在这个函数中没有。我得到消息:Warning: Invalid argument supplied for foreach()

 function mic_services_shortcode($atts = [], $content = \'\') {
        global $post;
        $id = $post->post_name;
        $id = explode("-s", $id);
        global $wpdb;
        $prepare = $wpdb->prepare(\'SELECT DISTINCT wp_mic_keyword.keyword as keyword, wp_mic_keyword.image as image, wp_mic_keyword.texte as texte\'. \'  FROM wp_mic_keyword INNER JOIN wp_mic_rel_key_ser ON id_keyword where id_service=%d;\', $id);
        $results = $wpdb->get_results($prepare);
        ob_start();
        echo \'<div style="border: 1px solid black;>\';
        foreach ($results as $key) { 
           echo 
           \'<div>\';      
            echo $key->keyword.\'<br>\';
            echo $key->image ."<br>";
            echo
            $key->texte;        
            echo \'</div>\';
        }
        echo \'</div>\';
        $html_form = ob_get_clean();
        return $html_form;
    }
我已经在SQL中测试了该请求,效果很好。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

如果foreach() 不是数组。因此,您的第一步应该是通过检查$results 确认结果符合您的预期。如果不是,那么它可能会给你一些线索来解释原因。这是调试101。

如果你这样做,你会发现你没有得到结果。如果你没有得到结果,那么下一步就是找出原因。这样做的方法是检查您实际查询的内容。您可以通过检查$prepare

如果这样做,您将看到SQL查询与您期望的不匹配。很可能id_service= 缺少或不正确。

请注意,到目前为止,所有这些步骤都不需要任何WordPress开发知识、特殊调试工具或IDE,甚至不需要任何PHP基础知识。比学习PHP或WordPress API更重要的是教会自己遵循这些非常基本的调试步骤。

因此,如果您遵循这些步骤,您将看到id_service= 查询的一部分缺少值或值不正确。这是什么原因?您正在使用$wpdb->prepare() 插入$id. 但是什么是$id? 在你用过的这条线上explode() 要创建它,请执行以下操作:

$id = explode("-s", $id);
什么是explode() 做如果您只需找到explode() article in the PHP manual 您将看到:

返回字符串数组。。。

所以$id 是字符串数组。

什么是$wpdb->prepare() 做它可以用SQL字符串中的变量安全地替换占位符。As documented:

查询字符串中可以使用以下占位符:%d(整数)%f(浮点)%s(字符串)

但在你的代码中%d, 用于替换整数,但如上所述,$id 不是整数。这是一个字符串数组。因此,如果您的问题是:$id is not the right value for what you\'re trying to do.

这是我在不知道你想做什么的情况下所能做到的。但是如果您按照我上面概述的调试步骤进行操作,您应该能够找出哪里出了问题。

相关推荐

重写WordPress中$ATTS SHORTCODE_ATTS内的类

我有一个插件,我需要调整一个函数。特别是\'class\' => \'\'. 这是插件中的代码:function message_to( $atts, $content = null, $tag = \'\' ) { $atts = shortcode_atts( array( \'to\' => \'{current-post-author}\', \'subject\' => \'{current-po