Как mysql update выполнить через время после запроса?

573
28 ноября 2016, 18:39

у меня есть запрос который должен по истечению минуты только выполнять update а оно сразу выполняет игнорируя time

$this->db->query("
        update colban
        set `go` = `go` -1
         where id = '".(int)$this->url[450]."' 
        < ".( time()-60*1 )); 
    }
Answer 1

Как уже многие сказали, тебе это не нужно.

Причина этого вопроса - в непонимании элементарных основ баз данных.

Проверять значение должен не тот скрипт, который записывает данные, а тот, который читает.

То есть в данном случае мы не определенное значение записываем в БД в нужное время, а записываем желаемое время изменения значения.

А все читающие скрипты будут считывать это время и сравнивать с текущим. Если больше - то значение изменилось. Очень просто, и не требует никаких костылей из других ответов. Так работают базы данных во всем мире.

Answer 2
  1. Условие WHERE в SQL-запросе всего лишь задает условие, при соблюдении которого будет обновлена запись. Оно никаким образом не управляет временем исполнения запроса.
  2. Откуда вы вообще взяли подобный синтаксис?
  3. Составление запроса таким образом - крайне плохая практика. Изучите как работает mysqli_stms_bind_param
  4. Для того, чтобы отложить выполнение какой либо команды есть куча вариантов, но все они в той или иной мере являются костылями.

Например:

  • Можно создать JOB в mysql, который будет переодически читать таблицу очереди (в которую вы будете заносить задания на update) и выполнять те, которые старше минуты
  • Можно тупо притормозить выполнение скрипта оператором sleep(60)
  • Можно по curl (с обрывом сессии) вызывать скрипт, который будет выполнять update через минуту
  • Можно сохранять задачи на update в файл(или таблицу БД) и по крону запускать обработку (почти то-же самое, что и первый вариант)
  • Можно помудрить с events
  • Можно посмотреть на FPM и его функцию fastcgi_finish_request
  • И т.д. и т.п.
Answer 3
  1. Вариант 1 - используйте функцию mysql SLEEP(), команда DO SLEEP(60);

    Пример запроса mysql:
    DO SLEEP(60);
    UPDATE ...
    можно использовать SELECT SLEEP(60), но в данном случае нужно учитывать, что на выходе всегда будет 0 или 1.

  2. Вариант 2 - используйте функцию php sleep().

    Пример:
    SLEEP(60);
    $this->db->query("...");

Оба варианта откладывают выполнение на N секунд.

Данные функции не стоит использовать если Вы выполняете следующий запрос только после получения результатов выполнения предыдущего, т.к., например, последовательный вызов 2-х запросов приведет к простою 2*N секунд.

READ ALSO
проблема с foreach и записью в бд

проблема с foreach и записью в бд

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

395
Angular vs jQuery

Angular vs jQuery

Объясните в чем преимущества Angular перед jQuery, если такие естьВ каких случаях целесообразней использовать ангулар?

460