目标:
网站会上传一些活动,有开始时间/结束时间/状态等数据上传到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);
?>
翻遍手册找不到原因,只好另外想办法.
解决方案:
创建一个WINDOWS计划任务,定时运行PHP,让PHP修改数据库的状态.方案可行,就是有点傻.
用MYSQL触发器,每插入一个新活动自动写一个事件.失败.MYSQL8.0报错.
用MYSQL函数或过程写事件.失败.MYSQL8.0报错.
用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需要大于当前时间.