验证DateTime :: modify()的字符串输入

时间:2016-01-20 11:54:18

标签: php database validation date

我的情况是从用户编辑的数据库中读取发送到$string的{​​{1}}变量,如何验证DateTime::modify($string)$string的正确字符串}?

4 个答案:

答案 0 :(得分:1)

尝试此功能,根据格式

验证时间戳字符串
function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

函数已从此answerphp.net

复制

答案 1 :(得分:0)

在将用户输入保存到数据库之前检查用户输入通常是最佳做法,这样您就可以在出路时对其充满信心。

您也可以使用try / catch块:

modify

编辑:看了这个之后,如果传递给Warning的字符串无效(不是我原先假设的日期字符串),你的代码将抛出Warning而不是例外。

set_error_handler

然而,这开始看起来有点讨厌。它可能更干净(在您的代码中,而不是您的日志中)来比较调用function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext) { throwErrorException($errstr, 0, $errno, $errfile, $errline); } set_error_handler('warning_handler', E_WARNING); try { $date = new DateTime('2016-12-12'); $date->modify('+1 daybla'); echo $date->format('Y-m-d'); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } restore_error_handler(); 方法之前和之后的日期,看它们是否不同。

modify

答案 2 :(得分:0)

您可以执行类似的操作,并在将字符串传递到实际日期之前调用它:

Route::get('/cmd', function () {
    chdir('../');
    $dir =  getcwd();
    print_r($dir);
    $cmd = shell_exec ('php artisan cache:clear');
    return $cmd;
});

function modifyIsValid($modifyString) { $d = new DateTime(); $isValid = $d->modify($modifyString); if ($isValid === false) { return false; } return true; } 返回false表示传递的字符串无效,但它也会抛出->modify(),这是不理想的。

E_Warning

您可以在手册中找到有关它的更多信息:http://php.net/manual/en/datetime.modify.php

希望它有所帮助。

答案 3 :(得分:0)

这里的派对迟到了,这对我很有用......

function isDateModifyValid($String)
{
    if (strlen($String) == 0) { return false; }
    $now = new \DateTime(null, new \DateTimeZone("UTC"));
    $rtn = false; // Default return value
    @$now->modify($String) && $rtn = true; 
     // If modify($string) fails, $rtn won't set to true, else $rtn will set to true
    // ^ ^ @ suppress error
    return $rtn;
}

//TEST DATA
foreach (array("+1 hour", "+2 hour, -5 minutes", "12:00", "dsfv", "13:00, + 1 hour", "Yesterday, 12:00", "Neext weeekc", "Next month") as $testString)
{
    if (isDateModifyValid($testString))
    {
        echo "VALID ::: $testString\n";
    } else {
        echo "INVALID ::: $testString\n";
    }
}

VALID ::: +1 hour VALID ::: +2 hour, -5 minutes VALID ::: 12:00 INVALID ::: dsfv VALID ::: 13:00, + 1 hour VALID ::: Yesterday, 12:00 INVALID ::: Neext weeekc VALID ::: Next month