从数据库为WordPress中的每个数组项从数组中获取数据

时间:2019-06-27 12:59:37

标签: php mysql wordpress

我正在为WordPress编写一个反应插件,并尝试使用chart.js为过去7天每天的反应计数的管理员创建一个图表。用户反应记录在数据库的以下列中:postIdreactedToreactedDate。示例行将为182Haha27 Jun 2019

我正在使用JavaScript生成具有相同格式的过去7天日期的数组,以为图表创建标签,还尝试通过AJAX在后端将其发送,以从数据库中获取每个日期记录的计数以数组格式。因此,例如,数据库包含以下数据:

postId reactedTo reactedDate
145 Like 22 Jun 2019
182 Haha 24 Jun 2019
182 Haha 27 Jun 2019

我正在使用JS中的以下代码生成过去7天的数组:

    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var lastWeek = [];
    for (var i = 0; i < 7; i++) {
        var d = new Date();
        d.setDate(d.getDate() - i);
        lastWeek.push(d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear());
    }
    lastweek = lastWeek.reverse()

    console.log(lastweek); 
  

输出[“ 2019年6月21日”,“ 2019年6月22日”,“ 2019年6月23日”,“ 2019年6月24日”,“ 2019年6月25日”,“ 2019年6月26日”,“ 2019年6月27日”]

然后我将其通过AJAX发送到服务器,并在成功时生成图表。

    jQuery.ajax({
        url: ajaxurl,
        dataType: 'text',
        type: 'POST',
        data: {
            action: 'reactions_analytics',
            dates: JSON.stringify(lastWeek)
        },
        success: function(response, textStatus, jqXhr) {
            var reactionsChart = new Chart(ctx, {
                type: 'line',
                data: {
                    labels: lastWeek,
                    datasets: [{
                        data: response,
                }
            });
        }
    });

服务器中的response应该是数据库中每个日期的数字数组。如果找不到日期,则为0。因此应该为[0,1,0,1,0,0,1]

这是我当前的PHP代码,用于在数据库中搜索并以相同顺序生成日期计数数组,但是它输出的是空数组[]

    public function reactionsAnalytics() {
        global $wpdb;
        $tableName = $wpdb->prefix.'reactions';
        $dates = json_encode($_POST['dates']);
        $reacts = $wpdb->get_results("SELECT reactedDate, count(*) AS count FROM {$tableName} WHERE reactedDate IN ({$dates}) GROUP BY reactedDate", ARRAY_A);

        $result = array();
        foreach ($reacts as $react) {
            $result[] = $react['count'];
        }

        wp_die(json_encode($result));
    }

所以我认为我需要有关PHP的帮助。我的逻辑中不正确的是什么?可以做得更好吗?

基本上我正在尝试将其发送到服务器:["21 Jun 2019","22 Jun 2019","23 Jun 2019","24 Jun 2019","25 Jun 2019","26 Jun 2019","27 Jun 2019"]

在数据库[0,1,0,1,0,0,1]中找到相同的数组,每个日期都有计数编号

2 个答案:

答案 0 :(得分:0)

更改代码如下:

public function reactionsAnalytics() {
global $wpdb;
$tableName = $wpdb->prefix.'reactions';
$dates = str_replace("\\", "", $_POST['dates']);
$reacts = $wpdb->get_results("SELECT reactedDate, count(*) AS count FROM {$tableName} WHERE reactedDate IN ({$dates}) GROUP BY reactedDate", ARRAY_A);

$result = array();
foreach ($reacts as $react) {
    $result[] = $react['count'];
}

wp_send_json_success($result);

}

按如下所示更改js代码:

jQuery.ajax({
url: ajaxurl,
dataType : "json",
type: 'POST',
data: {
    action: 'reactions_analytics',
    dates: lastWeek.reverse()
},
success: function(response, textStatus, jqXhr) {
    if ( response.success === true ) {
        var reactionsChart = new Chart(ctx, {
                    type: 'line',
                    data: {
                        labels: lastWeek,
                        datasets: [{
                            data: response.data,
                    }
                });
        } else {
            // error
            alert('error occured !');
        }
    }
}});

答案 1 :(得分:0)

问题出在$ dates变量中,因为它返回带有[]的数组,并且需要SQL查询(),所以我用str_replace将[]替换为(),现在查询运行正常。