最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

php - reset data of an array

programmeradmin1浏览0评论

I need to do a type of reset in this query for when it detects a certain amount of videos seen from a different IP, send an alert message, the point here is that the condition is met when a user watches for example 4 videos in a certain time from an IP different and sends you the alert message, the problem is that if the user sees another video, he sends the alert again, but that video seen no longer enters the first condition, how can I make it respect it and when the user sees the fifth no longer send the message, could someone help me? I don't know much about php

the functions like wp_reset_ṕosdata and wp_reset_query () could serve me?

function qz_log_watch() {
    global $wpdb;

    $topic_id = $_REQUEST['topic_id'];
    $course_id = learndash_get_course_id($topic_id);
    $user_id = get_current_user_id();

    // $ban = qz_user_get_ban($user_id);
    // if ($ban) {
    //     qz_user_ban($user_id, $ban['reason']);
    //     wp_send_json_error(qz_user_get_ban_message($banReason));
    // }

    $wpdb->insert(
        $wpdb->prefix . 'quizard_event_log',
        [
            'event' => 'watch',
            'time' => current_time('mysql'),
            'user_id' => $user_id,
            'ip' => ip2long(get_ip_address()),
            'user_agent' => $_SERVER['HTTP_USER_AGENT'],
            'value' => $topic_id,
            'meta' => json_encode([
                'course_id' => $course_id
            ])
        ]
    );

    $accountSharing = [
        'hours_ago' => get_field('account_sharing_check_hours_ago', 'option'),
        'unique_video_watches_threshold' => get_field('account_sharing_unique_video_watches_threshold', 'option')
    ];

    $hoursAgo = $accountSharing['hours_ago'];
    $unbannedAt = get_user_meta($user_id, 'qz_unbanned_at', true);
    $dt = new DateTime();
    if ($unbannedAt) {
        $dt->setTimestamp($unbannedAt);
    } else {
        $dt->modify('-' . $hoursAgo . ' hours');
    }
    $fromTime = $dt->format('Y-m-d H:i:s');

    $results = $wpdb->get_results(
        "
        SELECT user_id, COUNT(*) as shared_watches FROM
            (
                SELECT user_id, `value`, (count(DISTINCT ip) > 1) as different_ips, COUNT(*) AS watches, ip
                FROM {$wpdb->prefix}quizard_event_log
                WHERE time >= '{$fromTime}'
                    AND user_id = $user_id
                GROUP BY user_id, `value`
            ) as t
        where t.watches > 1 and t.different_ips = 1
        group by t.user_id;
        "
    );

    if (is_array($results) && !empty($results)) {
        $row = $results[0];
        if ($row->shared_watches >= $accountSharing['unique_video_watches_threshold']) {
            $banReason = 'שיתוף';
            qz_user_ban($user_id, $banReason, false);
            //wp_send_json_error(qz_user_get_ban_message($banReason));
        }
    }

    wp_send_json_success();
}
add_action('wp_ajax_log_watch', 'qz_log_watch');

I need to do a type of reset in this query for when it detects a certain amount of videos seen from a different IP, send an alert message, the point here is that the condition is met when a user watches for example 4 videos in a certain time from an IP different and sends you the alert message, the problem is that if the user sees another video, he sends the alert again, but that video seen no longer enters the first condition, how can I make it respect it and when the user sees the fifth no longer send the message, could someone help me? I don't know much about php

the functions like wp_reset_ṕosdata and wp_reset_query () could serve me?

function qz_log_watch() {
    global $wpdb;

    $topic_id = $_REQUEST['topic_id'];
    $course_id = learndash_get_course_id($topic_id);
    $user_id = get_current_user_id();

    // $ban = qz_user_get_ban($user_id);
    // if ($ban) {
    //     qz_user_ban($user_id, $ban['reason']);
    //     wp_send_json_error(qz_user_get_ban_message($banReason));
    // }

    $wpdb->insert(
        $wpdb->prefix . 'quizard_event_log',
        [
            'event' => 'watch',
            'time' => current_time('mysql'),
            'user_id' => $user_id,
            'ip' => ip2long(get_ip_address()),
            'user_agent' => $_SERVER['HTTP_USER_AGENT'],
            'value' => $topic_id,
            'meta' => json_encode([
                'course_id' => $course_id
            ])
        ]
    );

    $accountSharing = [
        'hours_ago' => get_field('account_sharing_check_hours_ago', 'option'),
        'unique_video_watches_threshold' => get_field('account_sharing_unique_video_watches_threshold', 'option')
    ];

    $hoursAgo = $accountSharing['hours_ago'];
    $unbannedAt = get_user_meta($user_id, 'qz_unbanned_at', true);
    $dt = new DateTime();
    if ($unbannedAt) {
        $dt->setTimestamp($unbannedAt);
    } else {
        $dt->modify('-' . $hoursAgo . ' hours');
    }
    $fromTime = $dt->format('Y-m-d H:i:s');

    $results = $wpdb->get_results(
        "
        SELECT user_id, COUNT(*) as shared_watches FROM
            (
                SELECT user_id, `value`, (count(DISTINCT ip) > 1) as different_ips, COUNT(*) AS watches, ip
                FROM {$wpdb->prefix}quizard_event_log
                WHERE time >= '{$fromTime}'
                    AND user_id = $user_id
                GROUP BY user_id, `value`
            ) as t
        where t.watches > 1 and t.different_ips = 1
        group by t.user_id;
        "
    );

    if (is_array($results) && !empty($results)) {
        $row = $results[0];
        if ($row->shared_watches >= $accountSharing['unique_video_watches_threshold']) {
            $banReason = 'שיתוף';
            qz_user_ban($user_id, $banReason, false);
            //wp_send_json_error(qz_user_get_ban_message($banReason));
        }
    }

    wp_send_json_success();
}
add_action('wp_ajax_log_watch', 'qz_log_watch');
Share Improve this question edited Nov 28, 2020 at 23:36 shanebp 5,0836 gold badges27 silver badges40 bronze badges asked Nov 28, 2020 at 22:42 Angie_10Angie_10 11 bronze badge
Add a comment  | 

1 Answer 1

Reset to default 0

try to comment out the last if

/* 
if (is_array($results) && !empty($results)) {
    $row = $results[0];
    if ($row->shared_watches >= $accountSharing['unique_video_watches_threshold']) {
        $banReason = 'שיתוף';
        qz_user_ban($user_id, $banReason, false);
        //wp_send_json_error(qz_user_get_ban_message($banReason));
    }
}
*/

this if I cannot understand if is where the message is send or where the user gets ban, maybe it is the solution to delete this code or comment it out.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论