За последние 24 часа нас посетили 14872 программиста и 1705 роботов. Сейчас ищут 915 программистов ...

Как сделать 1 запрос вне зависимости от количества переходов?

Тема в разделе "PHP для новичков", создана пользователем xmaqu, 26 июл 2023.

Метки:
  1. xmaqu

    xmaqu Новичок

    С нами с:
    26 июл 2023
    Сообщения:
    1
    Симпатии:
    0
    2 дня пытаюсь уже решить проблему, спрашивал часами чатгпт с примерами, но всё равно проблема остается
    у меня есть такой код:
    PHP:
    1. if ( $user_damage > $battle['health'] ) {
    2.     mysql_query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
    3.     mysql_query('START TRANSACTION');
    4.     try {
    5.         mysql_query('UPDATE `basement_clans` SET `json_key` = JSON_SET(`json_key`, \'$."' . 'key_'.($battle['boss_id'] + 1) . '"\', JSON_EXTRACT(`json_key`, \'$."' . 'key_'.($battle['boss_id'] + 1) . '"\') + 1), `json_limit` = JSON_SET(`json_limit`, \'$."' . 'boss_'.$battle['boss_id'] . '"\', JSON_EXTRACT(`json_limit`, \'$."' . 'boss_'.$battle['boss_id'] . '"\') + 1), `json_medals` = JSON_SET(`json_medals`, \'$."' . 'boss_'.$battle['boss_id'] . '"\', JSON_EXTRACT(`json_medals`, \'$."' . 'boss_'.$battle['boss_id'] . '"\') + 1) WHERE `clan` = '.$clan['id'].' AND `jail` = '.$user['reset']);
    6.                      
    7.         mysql_query('DELETE FROM `_basement_battle` WHERE `id` = '.$battle['id']);
    8.                          
    9.         mysql_query('COMMIT');
    10.     } catch (Exception $e) {
    11.         mysql_query('ROLLBACK');
    12.     }
    13. }

    проблема: когда одновременно бьют несколько пользователей или более, то засчитывает столько сколько было одновременных ударов

    нужно: чтобы был 1 запрос вне зависимости сколько было этих одновременных ударов

    использовал: мемкеш, блокировку запросов, атомарные операции, циклы
    ничего не помогает, уже не знаю что делать (

    есть 3 таблицы:
    basement_clans (id, clan, json_key, json_limit, json_medals, jail) -- С откуда берутся ключи (с которыми и проблема) ($clanData)
    _basement_battle (id, clan_id, boss_id, health, jail, time) -- Само сражение ($battle)
    _basement_member (id, user_id, user_health, fight_id, clan_id, boss_id, damage, jail) -- Участники сражения (fight_id -> id) ($member)
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    вопрос конечно бредово описан.... тут человек то не поймет не то что чатгпт...
    как я понимаю суть такая - есть некая таблица - туда нужно внести обновление... но только одно - видимо за какой то промежуток времени .. так?
    тогда надо ввести доп поле - датавремя последнего запроса - в вашей терминологии "удара" ....
    и при обновлении - дополнительно смотреть - сколько времени прошло с момента последнего запроса... например 1 в 5 минут .... - в where добавить - AND last_online > now() + interval 5 minute или что там нужно
    суть должны понять