【问题标题】:PHP SQL Get Date Time from Username and compare to todays datePHP SQL 从用户名获取日期时间并与今天的日期进行比较
【发布时间】:2021-08-19 11:19:17
【问题描述】:

我想从指定的用户名获取日期时间并与今天的日期进行比较。我正在使用数据库。

  $con = mysqli_connect("server", "name", "pass", "db");
  if(!$con) {
    die("noconn");
  }
  
  $HWID = "";
  if(isset($_POST['HWID']) && !empty($_POST['HWID'])) {
    $HWID = mysqli_real_escape_string($con, $_POST['HWID']);
    $HWID = ($HWID);
  }
  elseif(isset($_GET['HWID']) && !empty($_GET['HWID'])) {
    $HWID = mysqli_real_escape_string($con, $_GET['HWID']);
    $HWID = ($HWID);
  } else {
    die("nodata");
  }

  $rows= "";
  if(isset($_GET['Expire_Date'])){
      $id=$_GET['Expire_Date'];
      $sql="SELECT HWID FROM users WHERE Expire_Date='$id'";
      $result=mysql_query($sql); 
      $rows=mysql_fetch_array($result);
  }

  if (strtotime((new DateTime())->format("Y-m-d H:i:s")) > strtotime($rows)) {
    die("valid");
  } else {
    die("invalid");
  }

代码与 C# 配合使用

    dataToSend["HWID"] = HWID();
    string GetData = Encoding.UTF8.GetString(wc.UploadValues(@"http://127.0.0.1/test.php", dataToSend));

    if (GetData == "valid")
    {
        MessageBox.Show("date is valid", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else if (GetData == "invalid")
    {
        MessageBox.Show("date is not valid", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

假设 HWID(硬件 ID)是数据库中的用户名 18585B53C213CA86DE91BE1E2772D66C6EC3F32F,并且指定的日期为 2021-07-01。所以当日期用完时,它会告诉无效,否则如果它没有用完,它会告诉有效。每次我尝试这段代码时,它都会给我有效。我不确定我是否正确指定了用户名或没有正确比较。

【问题讨论】:

  • strtotime($rows) - 您正在尝试从包含整行数据的数组创建时间戳。您只需选择一列,即包含实际日期的一列。
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • 您在 PHP 中混合 API。 mysql_query 不存在
  • strtotime((new DateTime())->format("Y-m-d H:i:s") 看起来太复杂了。为什么不直接使用time()
  • $HWID = ($HWID); 也没有多大意义。

标签: c# php mysql sql


【解决方案1】:

首先,您应该使用准备好的语句。如果您想使用 mysqli,那么我将在下面向您展示如何操作,但我强烈建议您学习 PDO。

您可以检查DateTime 对象自身。无需使用旧的strtotime() 功能。您只需要从数据库中选择单个值。

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = mysqli_connect("server", "name", "pass", "db");

$HWID = "";
if (!empty($_POST['HWID'])) {
    $HWID = $_POST['HWID'];
} elseif (!empty($_GET['HWID'])) {
    $HWID = $_GET['HWID'];
} else {
    die("nodata");
}

$stmt = $con->prepare("SELECT Expire_Date FROM users WHERE HWID=?");
$stmt->bind_param('s', $HWID);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_object();
$Expire_Date = $row->Expire_Date;

if (new DateTime() > new DateTime($Expire_Date)) {
    die("valid");
} else {
    die("invalid");
}

【讨论】:

  • 我注意到它提供了一个 HWID 进行比较,而不是来自指定 HWID 的数据库时间。
  • @MattThhh 是的,我真的不知道你从哪里得到的日期
  • 我想从数据库中指定的 HWID 获取数据库时间。 This is how the database are looking
  • 我删除了 GET 输入并交换了 SELECT 语句。这是你的意思吗?
  • 第 23 行显示未定义变量 Expire_Date
【解决方案2】:

正如 El_Vanja 所说,您的问题是 strtotime($rows)。当您使用$rows=mysql_fetch_array($result); 获取行时,您会得到一个包含所有选定列的数组(请参阅doc here,您应该注意它自 PHP 5.5 起已贬值并从 PHP 7.0 及更高版本中删除)。 当您阅读 strtotime 的doc 时,您的第一个参数必须是字符串。

要修复您的错误,您只需将$rows=mysql_fetch_array($result); 替换为$rows=mysql_fetch_array($result[0]);$rows=mysql_fetch_array($result["HWID"]);。我个人更喜欢第二个更具可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多