Php 如何编写一个程序,每x分钟自动修改一次现有的SQL数据库?
我是一个PHP/SQL新手用户…完成我的第一个PHP网站。该问题类似于在以下位置找到的初始问题: 但我没有完全理解答案。与该用户类似,我有一个数据库的完整列(称为status)(称为challenge),它可以接受3个状态值—“非活动”、“挂起”或“活动”。在正常的网站操作流程中,用户A通常会单击按钮(事件1),在数据库中创建一个新行(具有唯一的*challenge_id*),并在该行中触发“挂起”状态。用户B可以使用其他单击的按钮更改状态,这些按钮可以将状态设置为“非活动”或“活动” 一种不希望出现的情况是,用户B什么也不做(即,没有事件触发器)。在这种情况下,用户A不幸被卡住,等待状态从“挂起”变为“活动”或“非活动”,然后他/她才能单击并触发下一个事件1。这种情况可能会发生,例如,如果用户B厌倦了该站点,不再使用它,导致“挂起”请求未得到响应 显然,我可以手动更改SQL,在特定时间限制后将任何“挂起”状态更改为“不活动”。这在一开始是可以的,但是如果这个网站变得流行起来,这将需要更多的时间。有没有办法编写一个非PHP程序来解释这种“无事件触发器”的情况,在这种情况下,所有“挂起”状态的SQL条目都会在一定的时间限制后自动更改?或者PHP可以做到这一点?我尝试编写一个php脚本,每次任何用户登录时都会扫描数据库(注意:*challenge_id*是由另一个php页面上触发的事件创建的):Php 如何编写一个程序,每x分钟自动修改一次现有的SQL数据库?,php,mysql,sql,Php,Mysql,Sql,我是一个PHP/SQL新手用户…完成我的第一个PHP网站。该问题类似于在以下位置找到的初始问题: 但我没有完全理解答案。与该用户类似,我有一个数据库的完整列(称为status)(称为challenge),它可以接受3个状态值—“非活动”、“挂起”或“活动”。在正常的网站操作流程中,用户A通常会单击按钮(事件1),在数据库中创建一个新行(具有唯一的*challenge_id*),并在该行中触发“挂起”状态。用户B可以使用其他单击的按钮更改状态,这些按钮可以将状态设置为“非活动”或“活动” 一种不
如果您的web&PHP服务器在Linux上运行(通常是这样),并且如果延迟x超过几分钟(即x>=5分钟),则可以使用并添加一个条目。记住在那里使用绝对路径。该条目将(定期)运行一些脚本(可以用PHP编写,也可以用Python或OCaml等其他脚本语言编写),以更新MySQL数据库。首先,您的update
语句是错误的。假设challengetime
是包含unix时间值的int数据类型,那么UPDATE语句应该如下所示
更新挑战
设置状态='inactive'
其中status='pending'
1000
它可以而且应该独立运行。在调用之前,不需要选择任何内容。
因此,您可以更改此部分
$universaltime = time();
$sqlt = mysql_fetch_assoc(mysql_query("SELECT challenge.challengetime,
challenge.status FROM challenge"); //Selects an array of all values for challengetime
//and status for all users I presume
while ((($universaltime - $sqlt['challengetime']) > 1000) &&
($sqlt['status'] == 'pending'))
{
$sqlt1 = mysqli_query("UPDATE challenge SET $sqlt['status'] ='inactive'");
//Also tried with if instead of while
}
仅仅
$sql = "UPDATE challenge SET status = 'inactive' WHERE status = 'pending' AND 1000 < UNIX_TIMESTAMP() - challengetime";
$result = mysql_query($sql);
if (!$result) {
die('Invalid query: ' . mysql_error()); //TODO better error handling
}
存储过期日期而不是状态?为什么要在那里使用sha1()?您的会话变量无论如何都是私有的,因此不应该首先要求单向散列,除非黑客能够不断访问您的系统,甚至解决了错误的问题。表中的challengetime
是什么数据类型?谢谢您,彼得……我尝试了您的php代码,效果非常好。从概念上讲,我知道类似您的解决方案是正确的解决方案,但我就是无法生成正确的代码。你的代码工作得很好……我将研究你定期执行MySQL事件的“第一选项”。顺便说一下,对于你的“第一选项”,一旦“事件调度程序”设置为“开”,我将全局事件调度程序设置为开;您的“第一选项”代码是否可以包含在与上述php解决方案相同的php文件中,或者该代码是否必须用SQL编写?@困惑的化学家非常欢迎您。我很高兴能帮上忙:)不需要在php中添加事件创建代码。只需在phpMyAdmin或mysql命令行实用程序(或任何其他mysql客户端)中执行它,就像mysql中的任何其他CREATE语句一样(例如CREATE TABLE
)。您可以使用显示事件
列出现有事件。
$sql = "UPDATE challenge SET status = 'inactive' WHERE status = 'pending' AND 1000 < UNIX_TIMESTAMP() - challengetime";
$result = mysql_query($sql);
if (!$result) {
die('Invalid query: ' . mysql_error()); //TODO better error handling
}