Событие MySql, которое обновляется ежедневно и изменяет некоторые элементы в базе данных в зависимости от их содержимого

По сути, я создаю простой аукционный сайт. Я хочу, чтобы код проверял каждую ночь в 21:00 на предмет предметов, срок действия которых истекает сегодня. Если он их обнаружит, он должен вставить в базу данных участника, предложившего самую высокую цену, в качестве покупателя. Вот что у меня пока не работает:

DELIMITER $$

CREATE 
    EVENT `sold` 
    ON SCHEDULE EVERY 1 DAY STARTS '2018-05-03 21:00:00' 
    DO BEGIN
        declare amt int;
        declare counter int;
        set counter=0;
        set amt = SELECT COUNT(*) FROM ITEMS;
        declare test;
while (counter < amt)
begin
    set test = select Visibility FROM ITEMS where Keyy = counter;
    if (test == 1)
        set test = select sold from ITEMS where Keyy = counter;
        if (!test)
            set test = select Exp from ITEMS where Keyy = counter;
            if (test == CURDATE())
                UPDATE ITEMS SET `sold`= `bidder` WHERE Keyy =counter;
set counter = counter + 1;

end

    END */$$

DELIMITER ;

Есть ли у вас доступ к работе cron?

SpacePhoenix 04.05.2018 21:19

«Сегодня» где-то между 9 и полуночью?

Strawberry 05.05.2018 01:04

@SpacePhoenix Он находится на сервере Windows, поэтому я потенциально могу использовать запланированные задачи.

Wiley Mutch 07.05.2018 19:53

@Strawberry от Today Я имею в виду любой пост, срок действия которого истекает сегодня. У меня не было времени ввода пользователей, только даты

Wiley Mutch 07.05.2018 19:54

Понятно - значит, заявки запечатаны?

Strawberry 07.05.2018 20:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
22
1

Ответы 1

Идентификаторы переменных DECLAREd в MySQL не начинаются с @; это только для переменных «сеанса» (которые являются глобальными для соединения с базой данных).

Также:

  • "test" не был объявлен с типом
  • == - это не оператор равенства в MySQL, а просто =.
  • set variable = select ... может иметь проблемы, если выбор не может гарантировать единственный результат; некоторым из них могут потребоваться пункты LIMIT 1 ... хотя похоже, что вы просто проверяете наличие данных, поэтому запросы EXISTS могут быть более полезными для них.
  • в конце вашего приращения счетчика отсутствует НАБОР
  • */ здесь не место, он предназначен для закрытия комментариев блока.

Также

DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

от https://dev.mysql.com/doc/refman/8.0/en/declare.html

Это означает, что вы не можете чередовать DECLARE и SET.

благодарю вас! Я обновил его, но он по-прежнему не работает эффективно.

Wiley Mutch 04.05.2018 19:48

см. отредактировать список вещей, которые я заметил, помимо имен переменных.

Uueerdo 04.05.2018 19:50

Спасибо вам за все это. Это было большим подспорьем. Я борюсь с объявлениями переменных. Я чувствую, что это правильно, но он продолжает выдавать ошибки. DECLARE amt INT; SET amt = SELECT COUNT(1) FROM ITEMS; DECLARE test char(80) = ""; DECLARE counter INT; SET counter = 0;

Wiley Mutch 07.05.2018 19:49

Другие вопросы по теме