验证日期是输入验证的另外一个重要方面。在给出一系列下列列表框或者自由的文本字段情况下,用户选择诸如2005年2月29日或者2005年4月31日这样的均为无效的日期非常容易。因此在使用用户提供的日期值计算之前检查其有效性非常重要。
在PHP中,该任务比在其他语言中要简单得多,这是因为checkdate()函数。该函数接受三个参数:月、天和年,然后返回一个指示日期是否有效的布尔值。下列例子以实际操作演示了该函数的使用:
试着输入一个无效日期,然后看看PHP是如何让你操作该无效日期的,不是很酷吗?<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF']?>' method = 'post'> Enter your date of birth: <br /><br /> <select name = 'day'> <?php // generate day numbers for ($x = 1; $x <= 31; $x++) { echo "<option value = $x>$x</option>"; } ?> </select> <select name = 'month'> <?php // generate month names for ($x = 1; $x <= 12; $x++) { echo "<option value=$x>".date('F', mktime(0, 0, 0, $x, 1, 1)).'</option>'; } ?> </select> <select name = 'year'> <?php // generate year values for ($x = 1950; $x <= 2005; $x++) { echo "<option value=$x>$x</option>"; } ?> </select> <br /><br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check if date is valid if (!checkdate($_POST['month'], $_POST['day'], $_POST['year'])) { die("ERROR: The date {$_POST['day']}-{$_POST['month']}-{$_POST['year']} doesn't exist!"); } // process the data echo "You entered {$_POST['day']}-{$_POST['month']}-{$_POST['year']} - which is a valid date."; } ?> </body> </html>
如果你在MySQL表格中储存日期输入,那么你会有趣的注意到MySQL在接受一个DATE、DATETIME或者TIMESTAMP类型的值之前不执行其自身的任何严格的日期检查。相反,它期望开发人员在其自身的应用程序中集成日期验证。MySQL愿意做的最多是当它遇到一个明显不合法的值时将其转化为一个零值(根本就没有帮助)。阅读更多的关于这点信息请到http://dev.mysql.com/doc/mysql/en/datetime.html。
当我们关注这个主题时,让我们更多的讨论一些关于多选表单基本元素(比如,下拉列表框和单选按扭)。在强制做出选择的情况时,开发人员必须确保至少可用选择中的一个已经被用户选择。这主要涉及isset()(用于多选列表框)、is_array()和sizeof()函数的灵活使用。下一个例子解释说明了这点:
这里没有什么令你十分伤脑筋的(isset()函数只是检查确认选项集合中是否至少一个已经被选择,如果没有,则打印一条错误消息)。请注意多选列表框是如何被验证的:当表单被递交后,这里所做的选择被放置于一个数组中,然后PHP的is_array()和sizeof()函数被用于测试该数组然后确定该数组包含至少一个元素。<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF'] ?>' method = 'post'> Pizza base: <br /> <input type = 'radio' name = 'base' value = 'thin and crispy'>Thin and crispy <input type = 'radio' name = 'base' value = 'deep-dish'>Deep-dish <br /> Cheese: <br /> <select name = 'cheese'> <option value = 'mozzarella'>Mozzarella</option> <option value = 'parmesan'>Parmesan</option> <option value = 'gruyere'>Gruyere</option> </select> <br /> Toppings: <br /> <select multiple name = 'toppings[]'> <option value = 'tomatoes'>Tomatoes</option> <option value = 'olives'>Olives</option> <option value = 'pepperoni'>Pepperoni</option> <option value = 'onions'>Onions</option> <option value = 'peppers'>Peppers</option> <option value = 'sausage'>Sausage</option> <option value = 'anchovies'>Anchovies</option> </select> <br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check radio button if (!isset($_POST['base'])) { die('You must select a base for the pizza'); } // check list box if (!isset($_POST['cheese'])) { die('You must select a cheese for the pizza'); } // check multi-select box if (!is_array($_POST['toppings']) || sizeof($_POST['toppings']) < 1) { die('You must select at least one topping for the pizza'); } // process the data echo "One {$_POST['base']} {$_POST['cheese']} pizza with "; foreach ($_POST['toppings'] as $topping) echo $topping.", "; echo "coming up!"; } ?> </body> </html>