Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写一个程序,每x分钟自动修改一次现有的SQL数据库?_Php_Mysql_Sql - Fatal编程技术网

Php 如何编写一个程序,每x分钟自动修改一次现有的SQL数据库?

Php 如何编写一个程序,每x分钟自动修改一次现有的SQL数据库?,php,mysql,sql,Php,Mysql,Sql,我是一个PHP/SQL新手用户…完成我的第一个PHP网站。该问题类似于在以下位置找到的初始问题: 但我没有完全理解答案。与该用户类似,我有一个数据库的完整列(称为status)(称为challenge),它可以接受3个状态值—“非活动”、“挂起”或“活动”。在正常的网站操作流程中,用户A通常会单击按钮(事件1),在数据库中创建一个新行(具有唯一的*challenge_id*),并在该行中触发“挂起”状态。用户B可以使用其他单击的按钮更改状态,这些按钮可以将状态设置为“非活动”或“活动” 一种不

我是一个PHP/SQL新手用户…完成我的第一个PHP网站。该问题类似于在以下位置找到的初始问题:

但我没有完全理解答案。与该用户类似,我有一个数据库的完整列(称为status)(称为challenge),它可以接受3个状态值—“非活动”、“挂起”或“活动”。在正常的网站操作流程中,用户A通常会单击按钮(事件1),在数据库中创建一个新行(具有唯一的*challenge_id*),并在该行中触发“挂起”状态。用户B可以使用其他单击的按钮更改状态,这些按钮可以将状态设置为“非活动”或“活动”

一种不希望出现的情况是,用户B什么也不做(即,没有事件触发器)。在这种情况下,用户A不幸被卡住,等待状态从“挂起”变为“活动”或“非活动”,然后他/她才能单击并触发下一个事件1。这种情况可能会发生,例如,如果用户B厌倦了该站点,不再使用它,导致“挂起”请求未得到响应

显然,我可以手动更改SQL,在特定时间限制后将任何“挂起”状态更改为“不活动”。这在一开始是可以的,但是如果这个网站变得流行起来,这将需要更多的时间。有没有办法编写一个非PHP程序来解释这种“无事件触发器”的情况,在这种情况下,所有“挂起”状态的SQL条目都会在一定的时间限制后自动更改?或者PHP可以做到这一点?我尝试编写一个php脚本,每次任何用户登录时都会扫描数据库(注意:*challenge_id*是由另一个php页面上触发的事件创建的):


如果您的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
}