如何在PHP中存储最后5个检查表单


how to store last 5 checked the form in PHP?

我开发了一个健身房系统,它有一个检查页面,这个页面检查会员是否完成了他的订阅,当会员进入健身房时,他必须输入他的号码(每个会员都有唯一的号码存储在数据库中),数据库有1000多个会员,我想从这个页面或者如果有另一种方式知道最后5个会员进入健身房)。

即:

Member1第一个进入健身房的人

Member2

Member3

Member4

Member5

Member6

Member7最后一个进入健身房的人

我需要存储不断最后5个成员进入健身房的表,有5行

从上面的例子中,检查表单的最后5个成员是:

Member3

Member4

Member5

Member6

Member7

如果member 8被输入,表将从member 4到member 8,以此类推…

注意:每隔5或10分钟就会有人进入

下面是简单的代码,只是为了让你知道这个检查页面是如何工作的

<form method="GET" action="">
 <input type="text" name="id" id="checkIn" />
 <input type="submit" value="Check" />
</form>
  $id = $_GET['id'];
  $con = mysqli_connect($host, $dbusername, $password, $dbname);
  $query = mysqli_query($con, "SELECT * FROM members WHERE id = $id");
 while ($row = mysqli_fetch_array($query))
{
   $time = $row['endTime'];
   $today = date("d-m-Y"); 
         if ( strtotime($time) >= strtotime($today) )
                  { echo “he can enter the gym”; }
             elseif ( strtotime($time) < strtotime($today) )
                  { echo “he can’t enter the gym”; }
 }

Thanks in advance

这个问题有几个部分——首先是关于数据库设计。如果您想执行这种操作,最简单的方法是在数据库中创建一个字段lastCheckedTime,该字段是一个unix时间戳,对应于会员登记进入健身房的时间。

在本例中,可以使用以下SQL显示最近进入健身房的5个成员。

SELECT * FROM members ORDER BY `lastCheckedTime` DESC LIMIT 5;
这个查询的两个功能部分是:
ORDER BY `lastCheckedTime` DESC

LIMIT 5

第一个子句告诉SQL服务器按成员最后一次检查表单的时间降序给出结果。第二个命令告诉SQL服务器只返回前五个结果。如果您想更改顺序,将DESC替换为ASC(升序)。

endTimelastCheckedTime字段的值应该是PHP的date()函数的直接输出。date()输出一个unix时间戳,它是一个整数,对应于从1970年1月1日00:00开始的秒数。通过这种方式存储日期,您可以使用简单的数学逻辑来比较日期。上面的代码基本上将时间戳整数转换为字符串,然后再转换回时间戳,这是对资源的浪费,而且在数据库中也不太有用。

然而,设计良好的数据库表的目的是您可以使用简单的逻辑提取有关该数据库中数据的任何统计信息。将时间存储为时间戳将大大有助于实现这一目标。可以为客户机提供更多数据的更好(补充)方法是创建第二个名为checkIn的表,其中包含以下列:

`id` int(8) PRIMARY KEY,
`memberId` int(8),
`checkedInTime` int(8)

每当一个会员进入健身房,你只需在这个表中输入一个新的行。那么下面的查询将达到与上面相同的效果:

SELECT * FROM member JOIN checkIn ON member.id = checkIn.memberId ORDER BY checkIn.checkedInTime DESC LIMIT 5;

这将提供完全相同的结果-然而,如果您的客户要求,您还可以使用checkIn表生成关于健身房最常使用的时间,哪些客户最常使用健身房以及其他有用信息的图形和数据。这是一个被称为数据库规范化的概念,我建议你试着去阅读和理解它——对于你目前的水平来说,它可能看起来相当高级,但它值得从早期阶段开始了解,因为它将大大增加你作为一个开发人员的价值,能够设计出能够为你的客户提供这种价值的系统。


与问题没有严格的关系,你的PHP代码中有一些基本的错误。

首先,也是最重要的一点,绝不允许将用户输入的字符串直接放入查询中,因为这会产生SQL注入错误。正确的方法是对mysqli类使用参数化语句。因此,您将执行如下操作:

$conn = new mysqli($host, $dbusername, $password, $dbname);
$stmt = $conn->prepare("SELECT * FROM members WHERE id = ?");
$stmt->bind_param("i", $_GET['id']);
$stmt->execute();
另一个是下面的代码片段:
$time = $row['endTime'];
$today = date("d-m-Y"); 
if ( strtotime($time) >= strtotime($today) )

这实际上是将时间戳(如上所述)转换为字符串,然后再次转换为整数。这不仅是浪费,而且还阻碍了如上所述的良好数据库设计的目标。

根据我的理解,我建议您这样查询:

SELECT * FROM `members` ORDER BY id DESC LIMIT 0,5

它将得到你最后的5个成员,你可以通过应用你的where子句来修改它。