逾期更新状态

Update status when overdue

我正在做一个小型租赁系统,我的 SQL 数据库将记录客户租赁产品的详细信息和过期日期。如果日期超过逾期日期,'status'将自动由“当前租用”设置为“逾期”。截至目前,这是我能想到的,但当然,我的代码中的逻辑是错误的。请同时查看所附图片以获得更清晰的观察。

PHP

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "assignment3";



// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) 
{ 
die("Connection failed: " . $conn->connect_error);
}

$retrieve = mysqli_query($conn,"SELECT * FROM rentproducts WHERE status = 'Currently Renting'");
$row = mysqli_fetch_array($retrieve);
$today = new DateTime(date("d-m-Y"));
$overduedate = new DateTime($row['overduedate']);
$overduedays = $overduedate->diff($today)->format("%a");
echo $overduedays;

if ($overduedays >= 1) 
{
    $sql = "UPDATE rentproducts SET status = 'Overdue' WHERE status = 'Currently Renting'";
    mysqli_query($conn, $sql);
}
?>

确实你的逻辑是错误的。您的 UPDATE 查询会将所有记录从 'Currently Renting' 更改为 'Overdue',无论日期如何。

如果您想在日期大于另一个日期(例如昨天)时在 SQL 中设置一个值,那么您可以使用 SQL 日期函数。使用 NOW() 将为您提供日期时间格式的日期(即 Y-m-d H:i:s)或 CURDATE() 将为您提供日期格式的日期(即 Y-m-d 00:00:00)。然后你可以加减一个区间。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'password', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset

$stmt = $mysqli->prepare("UPDATE rentproducts 
    SET status = 'Overdue' 
    WHERE status = 'Currently Renting'
        AND overduedate >= CURDATE() - INTERVAL 1 DAY");
$stmt->execute();

您甚至可以在 MySQL 中设置一个事件来每天执行此查询。

但是,这不是一个好的数据库设计。您正在存储非规范化数据。虽然有时它可能有意义,但我认为在这种情况下,您应该保留 status 列原样,甚至完全删除它,因为它不提供任何额外信息。让您的应用程序处理从数据库读取数据时的状态。

例如:

$stmt = $mysqli->prepare("SELECT * 
    FROM rentproducts 
    WHERE status = 'Currently Renting'
        AND overduedate >= CURDATE() - INTERVAL 1 DAY");
$stmt->execute();
$overdueRentals = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);