【问题标题】:php if-statement: 0>2012?php if 语句:0>2012?
【发布时间】:2012-03-11 13:17:18
【问题描述】:

也许是一个非常简单的问题,但是我不知道我做错了什么,也许有人可以帮助我?

有一个包含年份的 GET 变量,我想检查它是否实际上是有效格式,也不是过去的格式,即当前年份或之后的年份。到目前为止我所做的是:

$current_year=date('Y',$today);

(is_int(intval($_GET['year'])) AND $_GET['year']>$current_year) ? $year=$_GET['year'] : $year=$current_year;

函数 intval() 返回 0 或 1,如 php.net 手册中所述,如果 GET-var 不是整数,例如字符串“abc”。

但是,如果 $_GET['year'] 包含“abc”,然后转换为 0 并且不应该 > 2012,那么 $year 不是 2012!?

任何提示将不胜感激,并在此先感谢您!


编辑:

感谢您的所有精彩回答!我已经尝试考虑所有这些,现在这对我来说非常有效:

if (ctype_digit($_GET['year'])) { ($_GET['year'] > $current_year && $_GET['year']<=($current_year+2)) ? $year=$_GET['year'] : $year=$current_year;} else {$year=$current_year;}

因为我只需要未来 2 年,所以我添加了这个……谢谢你提示检查它是否只有 4 位数字,deceze! :)

【问题讨论】:

    标签: php if-statement int


    【解决方案1】:

    intval 会将anything 分解为int,即使只是分解为0,这意味着is_int 因此总是trueis_int(intval()) 因此毫无意义。 $_GET 值将始终是字符串,即使它们只包含数字。因此,您可能想使用ctype_digit 进行检查,它会告诉您字符串中的所有字符是否都是数字。所以你的支票应该是这样的:

    if (ctype_digit($_GET['year']) && $_GET['year'] > $current_year) ...
    

    【讨论】:

    • 是不是不用ctype_digit($_GET['year']) > $current_year
    • 非常感谢你! @Sheikh Heera:为什么没有必要?
    • @Sheikh No. ctype_digit 返回 truefalse。我们只是检查该值是否为数字,如果是,则它是否大于当前年份。
    • @Chris 因为一年应该有四位数字(无论如何在可预见的将来),您可能希望使用preg_match('/^\d{4}$/', $_GET['year']) 之类的内容更加严格地进行检查。
    【解决方案2】:

    intval() 不会更改传递给它的变量的类型。所以你真正做的是比较'abc'和'2012',因为date()返回一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 2022-11-16
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多