gpt4 book ai didi

php - 在设定的到期时间(例如 5 分钟)后删除数据库行

转载 作者:可可西里 更新时间:2023-11-01 07:51:43 25 4
gpt4 key购买 nike

背景:我正在设计一个在线虚拟教室管理系统...它的工作原理是在教师创建教室时生成随机 session key (md5(time)) 并将其存储在数据库中.

为了访问教室,学生访问唯一的教室 url,代码将 url 中的 session key (使用 GET)与数据库中的 session key 进行比较。如果匹配,则显示教室。

URL 通常如下所示:/classroom.php?instance=a529501db8373609f2d47a7843a461ea

需要编码方面的帮助:我希望我的老师也能够设置类(class)的“长度”,以便类可以访问 15 分钟、25 分钟或 50 分钟。

enter image description here

当教室创建后的时间超过例如 25 分钟时, session key 将从数据库中删除,教室将无法再访问。

我目前拥有的:

当老师点击按钮创建类时,下面的 PHP 会在数据库中存储 session key ($instance)和 session 长度($duration)...

<?php
session_start();
if (isset($_SESSION['id'])) {
if (isset($_POST['hidden'])) {

// Connects to the database
include_once("$_SERVER[DOCUMENT_ROOT]/classes/includes/dbconnect.php");
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

// Sets the session duration
$currentTime = time();
$duration = $currentTime + $_POST['duration'];

// Session variables
$uid = $_SESSION['id'];
$usname = $_SESSION['username'];

// To generate the random hash from the current time
$time = time(); // time to hash
$instance = md5($time); // hash stored in variable

// Stores the session hash (instance) and duration in the instance database
$query = ("INSERT INTO `my-db-name-foo`.`instances` (`instance`, `expiry`) VALUES (`$instance`, $duration`);");
mysql_query($query) or die(mysql_error());

// Closes the database connection
mysql_close();

// Redirects the teacher header('Location:classroom.php?instance='.$instance);
}
} else {
echo 'Please login';
die();
}
?>

然后在实际的 classroom.php 页面上有一段代码检查 session 是否已过期...如果是,则将其从数据库中删除。

<?php 

$currentTime = time();

if ($currentTime > $duration){
// Connect to database and delete the row
} else {
// show the classroom
}
?>

如有任何帮助或建议,我们将不胜感激!

更新----

感谢所有出色的回答,这是目前一切的工作方式...

在 createclassroom.php 页面上,我将实例以及 NOW() 日期和时间以及持续时间存储为 NOW() + $_POST['duration'];...

<?php
session_start();
if (isset($_SESSION['id'])) {
if (isset($_POST['duration']) && !EMPTY($_POST['duration'])) {

// Connects to the database
include_once("$_SERVER[DOCUMENT_ROOT]/classes/includes/dbconnect.php");

// Session variables
$uid = $_SESSION['id'];
$usname = $_SESSION['username'];

// To generate the random hash from the current time
$time = time(); // time to hash
$instance = md5($time); // hash stored in variable

// $duration = $_POST['duration'];
$duration = $_POST['duration'];

// Stores the hash (instance) in the instance database
$sql = ("INSERT INTO `xxx_xxxx`.`instances` (`id`, `teacher`, `instance`, `startdate`, `expiredate`) VALUES ('$uid', '$usname', '$instance', NOW(), NOW() + $duration);");
$query = mysqli_query($dbConnect, $sql)or die(mysql_error());

// Redirects the teacher
header('Location:classroom.php?instance='.$instance);
} else if (isset($_POST['hidden'])) {
echo 'Please select a duration';
}
} else {
echo 'Please login';
die();
}
?>

在实际的 classroom.php 页面上,我只检查未过期的 session 实例。

<?php 
session_start();

// Connects to the database
include_once("$_SERVER[DOCUMENT_ROOT]/classes/includes/dbconnect.php");

$instance = $_GET['instance']; // GETs instance from URL
$usname = $_SESSION['username']; // Gets teacher name

// script to retrieve all the Instances in the database and store them in a variable '$dbInstance'
$sql = "SELECT instance, expiredate FROM instances WHERE instance = '$instance' AND instances.expiredate > NOW()";
$query = mysqli_query($dbConnect, $sql);
$row = mysqli_fetch_row($query);

$dbInstance = $row[0];

if ($dbInstance == $instance){
echo $dbInstance.'<br>';
echo $instance;
} else {
echo $dbInstance.'<br>';
echo $instance.'<br>';
die('Instance not initiated');
}
?>

现在我只需要决定我想如何经常清除数据库。真的,我要感谢你们的帮助,这正是我所需要的!

最佳答案

这种行过期通常按如下方式处理:

  1. 把过期DATETIME在每一行中。 INSERT INTO tbl (id, expiration) VALUES (whatever, NOW() + INTERVAL 5 MINUTE)
  2. 查找行时,使用类似于 AND tbl.expiration > NOW() 的内容在查询中。这将使过期的行看起来消失了。
  3. 在方便的时候,也许是在通宵工作或每小时一次的事件中,删除过期的行:DELETE FROM tbl WHERE tbl.expiration <= NOW()

这比实际尝试 DELETE 更容易,时间也更精确。过期的行在它们过期的那一刻。它还可以应对即时 DELETE 操作的失败,并且可以很好地扩展。

关于php - 在设定的到期时间(例如 5 分钟)后删除数据库行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35129934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com