如何用PHP创建mysql定时事件

目标:

网站会上传一些活动,有开始时间/结束时间/状态等数据上传到MYSQL,需要在结束时间,把数据库的c_state状态改为”已结束”.

图片1.png

解决方案是,上传一个活动之后,马上去MYSQL手工创建一个事件.通过event事件修改数据库的c_state状态.

代码如下:


delimiter $$

create event evt_220401

on schedule at '2022-04-04 23:59:00'

do

begin

update t_test set c_state='已结束' where c_endtime = '2022-04-04 23:59:00';

end $$

delimiter ;

目标2:

然而,手工操作不符合”懒人作风”,有什么自动创建事件的方法吗?把MYSQL创建事件的代码搬到PHP,没报错,但没效果.

代码如下:

<?php
$sql=<<<aaa
delimiter $$
create event evt_220401
on schedule at '2022-04-04 23:59:00'
do
begin
update t_test set c_state='已结束' where c_endtime = '2022-04-04 23:59:00';
end $$
delimiter ;
aaa;
$result = $conn->query($sql);
?>

翻遍手册找不到原因,只好另外想办法.

解决方案:

  1. 创建一个WINDOWS计划任务,定时运行PHP,让PHP修改数据库的状态.方案可行,就是有点傻.

  2. 用MYSQL触发器,每插入一个新活动自动写一个事件.失败.MYSQL8.0报错.

  3. 用MYSQL函数或过程写事件.失败.MYSQL8.0报错.

  4. 用MYSQL事件写事件.失败.MYSQL8.0报错.

报错提示:

图片2.png

实在没其它法子了,只好回到PHP调试代码.最后总共花了两天时间才完成的用PHP创建mysql定时事件.

代码如下:


//数据库连接等代码省略...

$v_evtname = preg_replace('/\D/','',date('y-m-d H:i:s'));

$sql=<<<aaa

create event evt_{$v_evtname}

on schedule at "{$_POST['h_endtime']}"

do

begin

update t_test set c_state='已结束' where c_endtime = '{$_POST['h_endtime']}';

end

aaa;

$result = $conn->query($sql);

图片3.png

注意事项:

1.本文的编程环境为:windows10操作系统/PHP7.3软件/MYSQL8.0/Atom 编辑器.

2.跟MYSQL不同的是,PHP不需要重定义定界符.

3.事件名称不允许太多特殊符号,可用”_”,不可重复.

4.事件计划时间on schedule at需要大于当前时间.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容