Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 验证DateTime::modify()的字符串输入_Php_Database_Validation_Date - Fatal编程技术网

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

Php 验证DateTime::modify()的字符串输入,php,database,validation,date,Php,Database,Validation,Date,我有这样一个场景:从用户编辑的数据库中读取发送到DateTime::modify($string)的$string变量,如何验证$string是否是DateTime::modify()的正确字符串?尝试使用此函数根据格式验证时间戳字符串 function validateDate($date, $format = 'Y-m-d H:i:s') { $d = DateTime::createFromFormat($format, $date); return $d &&am

我有这样一个场景:从用户编辑的数据库中读取发送到
DateTime::modify($string)
$string
变量,如何验证
$string
是否是
DateTime::modify()
的正确字符串?

尝试使用此函数根据格式验证时间戳字符串

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

函数是从该函数复制而来的,或者

通常最佳做法是在将用户输入保存到数据库之前检查用户输入,以便您在退出时对其有信心

您还可以使用try/catch块:

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";
}
编辑:查看后,如果传递给
modify
的字符串无效(不是我最初认为的日期字符串),代码将抛出
警告
而不是异常

您可以触发一个
警告
,将其作为异常临时处理,使用
设置错误处理程序

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
方法之前和之后的日期,看看它们是否不同,可能会更干净(在代码中,可能不是在日志中)

$date = new DateTime('2016-12-12');
$origDate = clone $date; //I believe this will get you an independent object
$date->modify('+1 daybla');
if ($origDate == $date) {
    echo "Bad value passed to modify, probably a warning in the logs :(";
}

您可以这样做,并在将字符串传递到实际日期之前调用它:

function modifyIsValid($modifyString) {
    $d = new DateTime();
    $isValid = $d->modify($modifyString);

    if ($isValid === false) {
        return false;
    }

    return true;
}
->modify()
返回false表示传递的字符串无效,尽管它也会抛出一个不理想的
E_警告

$d = new DateTime();
$string = 'not a valid modifier';

if (modifyIsValid($string)) {
    // Continue 
}  else {
    // Print a friendly error message.
}
您可以在手册中找到有关它的更多信息:


希望有帮助。

在这里参加聚会有点晚了,这对我来说非常合适

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";
    }
}
有效::+1小时
有效时间::+2小时,-5分钟
有效时间:12:00
无效:::dsfv
有效时间:13:00,+1小时
有效日期:昨天12:00
无效:::Neext weeekc
有效期:::下个月

在应用修改功能之前,我使用此功能检查日期的格式。我需要验证修改格式正确的日期的字符串应该验证该字符串是DateTime::modify()可以理解的字符串。从函数内部调用此函数为什么必须添加
$d->format($format)==$date
?@systemovich为了确保您能够从发送的字符串构造正确的时间戳,从而确保正确的字符串,我同意在输入数据库之前应检查输入,我同意,但我希望尽可能在这方面进行验证-以防万一。我试着按照你的建议添加了一个try-and-catch,但当修改失败时仍然会发出警告?我也注意到了这一点-环顾四周后,我没有看到一个很好的方法来实现这一点。显然,在传递给
modify
的字符串上使用正则表达式是最好的,但该方法所使用的字符串似乎完全不同。也许您可以通过对用户输入进行更严格的限制来解决问题,例如三个输入:1)
+
/
-
,2)
小时
/
3)计数(整数)。我用其他几个选项编辑了答案,你可以试试——祝你好运!这看起来是验证字符串的一个好方法,但我需要处理警告,在这种情况下,是否可以简单地抑制警告?@ChristopherKarlsson这可能是消除错误的一种潜在方法,毕竟即使你抑制了错误,你仍然在处理它,所以应该没问题。另一种执行检查的方法很可能是使用正则表达式根据此处找到的所有有效格式验证字符串:我将接受此答案,因为它似乎是最接近于进行干净验证的答案,即使它引发警告,我也将按照@pherris answer中的建议处理此警告。此链接可能会对您有所帮助@RaviHirani您的链接考虑了一个类似的C#问题,但我不确定该实现建议可以用PHP完成?您的回答补充了什么,其他人没有?