【问题标题】:MySql event which updates daily and alters some items in the database based on their contentsMySql 事件,每天更新并根据其内容更改数据库中的某些项目
【发布时间】:2018-10-15 06:14:36
【问题描述】:

基本上,我正在创建一个简单的拍卖网站。我希望代码在每晚 9 点检查设置为今天到期的项目。如果找到,它应该将出价最高的人作为买方插入数据库。这是我到目前为止所拥有的,但不起作用:

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 作业吗?
  • “今天”是 9 点到午夜之间的任何时间?
  • @SpacePhoenix 它在 Windows 服务器上,所以我可以潜在地使用计划任务。
  • @Strawberry 今天我的意思是任何设置为今天到期的帖子。我没有用户输入时间,只有日期
  • 我明白了 - 所以他们是密封投标?

标签: php html mysql database mysqli


【解决方案1】:

MySQL 中DECLAREd 变量的标识符不以@ 开头;这仅适用于“会话”变量(对于与数据库的连接是全局的)。

还有:

  • “test”没有声明类型
  • == 不是 MySQL 中的相等运算符,只是 =
  • set variable = select ...如果选择不能保证单一结果,会出现问题;其中一些可能需要LIMIT 1 子句....虽然看起来您只是在检查数据是否存在,所以EXISTS 查询可能对这些更有帮助。
  • 您最后的计数增量缺少 SET
  • */不属于那里,是关闭block cmets。

还有

DECLARE 只允许在 BEGIN ... END 复合语句中 并且必须位于开头,在任何其他语句之前

来自https://dev.mysql.com/doc/refman/8.0/en/declare.html

这意味着您不能将 DECLARE 和 SET 交错。

【讨论】:

  • 谢谢!我已经更新了它,但它仍然无法有效运行。
  • 查看编辑以获取除变量名之外我注意到的内容列表。
  • 感谢您所做的一切。这是一个很大的帮助。我在变量声明中苦苦挣扎。我觉得它是正确的,但它不断抛出错误。 DECLARE amt INT; SET amt = SELECT COUNT(1) FROM ITEMS; DECLARE test char(80) = ""; DECLARE counter INT; SET counter = 0;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多