【问题标题】:form date verification issue表格日期验证问题
【发布时间】:2015-07-10 15:18:28
【问题描述】:

我正在构建一个简单的日期验证脚本,但我偶然发现了一个大问题。

$correct_date = FALSE;
if ($legal_month == $month_wozero || $legal_month == $month_wzero) {
    if ($legal_day == $day_wzero || $legal_day == $day_wozero) {
        if ($legal_year == $year)
            $correct_date = TRUE;
    }
}

$legal_day, $legal_month, $legal_year = 用户输入

$day_wozero/wzero, $month_wozero/wzero, $year = 服务器时间

用户需要输入他们下订单的日期。但很明显,这永远不会与我设置脚本的方式一起工作。商家的位置距离服务器 -2 小时。但这并不重要,因为有人可以在美国的任何地方下订单。因此,如果他们在纽约,可能是第二天,而业务在洛杉矶,日期会有所不同。也可能是本月的最后一天,纽约的月份也与洛杉矶不同。

在我看来,解决这个问题的唯一方法是构建一个完整的 if/else 嵌套规则集,以在特定时间调整时间和月份的差异。但我几乎可以肯定,必须有另一种我不知道的解决方法。

有什么建议吗?

【问题讨论】:

  • 为什么不完全放弃日期要求?
  • @ceejayoz 在我问这个问题之前我正在考虑这个问题。但我希望有一个简单的解决方案。

标签: php forms date timezone


【解决方案1】:

您需要知道用户时区才能执行此操作。您要么要求他们输入它(可靠但不方便用户),要么使用GeoIP lib。然而,GeoIP 的可靠性较低,因为用户可能使用了可能隐藏其 IP 的 VPN 或代理。

也许您也可以在 JS 端进行验证。这将是可靠的(假设用户的系统时钟是正确的),但显然它不安全,所以这取决于您的用例。

【讨论】:

    【解决方案2】:

    我会选择添加一个时区下拉列表,并尝试使用 JS 为他们选择正确的下拉列表,这样您就可以放心地知道它是从客户端提供给您的。

    在您的服务器上收到数据后,您应该使用此信息将用户日期转换为服务器的时区并进行比较,或者创建一个服务器日期值,该值位于用户提供的时区中并进行检查。

    示例

    // We'll want this for later
    $server_timezone = date_default_timezone_get();
    
    // Did the user supply a timezone and is it valid?
    if(
        $_POST['user_supplied_timezone'] !== '' &&
        date_default_timezone_set($_POST['user_supplied_timezone']) === TRUE
    )
    {
        // This accepts yyyy/m/d or yyyy/mm/dd formats
        if(
            $_POST['user_year'] === date('Y') &&
            ($_POST['user_month'] === date('n') || $_POST['user_month'] === date('m')) &&
            ($_POST['user_day'] === date('j') || $_POST['user_day'] === date('d'))
        )
        {
            // TRUE
        }
    }
    
    // It is officially "later"
    date_default_timezone_set($server_timezone);
    

    【讨论】:

    • 我不认为添加时区下拉菜单是我愿意为解决这个问题而做的事情。但这是一个非常酷的解决方案。谢谢
    • @Sickest 您可以随时将其添加为<input type="hidden" name="user_supplied_timezone">,如果您不希望用户弄乱它,请让 JS 提供该值。
    • @Sickest 能解决您的问题吗?
    【解决方案3】:

    How can I obtain the local time in jQuery?

    您始终可以在客户端幻灯片上获取本地时间并讨论日期,并在表单某处的隐藏输入类型中输入当前时区时间。

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多