【问题标题】:PHP DateTime exception and errors handlingPHP DateTime 异常和错误处理
【发布时间】:2013-04-15 15:31:56
【问题描述】:

如何防止 PHP 在创建 DateTime 对象时崩溃?

$in = new DateTime($in);
$out = new DateTime($out);

$in$out 都来自一个表单,所以它们可以是任何东西。我强制用户使用日历并使用 javascript 将其阻止为日期。如果用户可以绕过这个检查呢?

如果$in = "anything else other than a date" PHP 会崩溃并阻塞整个页面的渲染。

如果 PHP 无法解析日期,我该如何防止这种情况发生,只需 return(0)

【问题讨论】:

标签: php datetime


【解决方案1】:

查看DateTime() 上的文档,这里有一点sn-p:

<?php
try {
    $date = new DateTime('2000-01-01');
} catch (Exception $e) {
    echo $e->getMessage();
    exit(1);
}

echo $date->format('Y-m-d');
?>

PHP Manual DateTime::__construct()

【讨论】:

  • 这个异常不会被捕获,因为会抛出一个致命错误。在同一文档页面上查看此评论:php.net/manual/en/datetime.construct.php#113342
  • 这很好,但是有什么想法可以捕捉only无效的日期时间格式异常,而不是一般异常?
【解决方案2】:

strtotime() 会在格式错误时返回 false,所以这个应该捕获错误的格式。

if (strtotime($in) === false)
{
     // bad format
}

【讨论】:

  • 这不适用于像“30.11.-1”(即 0000-00-00)这样的值,var_dump 是 int(-62169987600)。
【解决方案3】:

异常处理呢?

try {
    $in = new DateTime($in);
} catch (Exception $e) {
    echo $e->getMessage();
    return(0);
}

【讨论】:

  • 有趣的是,类工厂 DateTime::createFromFormat 在无法解释字符串时抛出异常,而是返回 false。从而打破了 OOP 模型
【解决方案4】:

如果日期/时间字符串无法解析,DateTimeconstructor 将抛出异常。你可以抓住它。看看下面的sn-p:

try   {
    $dt = new DateTime('10th - 12th June 2013'); // bad date string
} catch (Exception $e) {
    var_dump($e->getMessage());
}

【讨论】:

    猜你喜欢
    • 2012-09-15
    • 2011-04-03
    • 2012-07-05
    • 2017-05-29
    • 2014-04-06
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多