因此现在你知道了如何捕获最基本的错误(丢失数据)然后在发生任何损害之前停止脚本的执行。但是如果数据存在,不过是错误类型或者大小,那么该怎么办呢?你的“丢失数据”测试不会被触发,但你的计算和数据库仍然会受到影响。很明显,你需要增加进一步的安全保护层,在这个安全保护层里,用户输入的数据类型也得到了验证。
下面是一个解释说明这一点的例子:
请注意,一旦我确认了字段包含一些数据,那么我增加一系列的测试以确认该数据满足数据类型和范围约束。首先,我用is_numeric()函数检查值是否是数值。该函数测试一个字符串以了解它是否是一个数值字符串(也就是只包含数值的字符串)。<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF']?>' method = 'post'> How many sandwiches would you like? (min 1, max 9) <br /> <input type = 'text' name = 'quantity'> <br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check for required data // die if absent if (!isset($_POST['quantity']) || trim($_POST['quantity']) == '') { die ("ERROR: Can't make 'em if you don't say how many!"); } // check if input is a number if (!is_numeric($_POST['quantity'])) { die ("ERROR: Whatever you just said isn't a number!"); } // check if input is an integer if (intval($_POST['quantity']) != $_POST['quantity']) { die ("ERROR: Can't do halves, quarters or thirds... I'd lose my job!"); } // check if input is in the range 1-9 if (($_POST['quantity'] < 1) || ($_POST['quantity'] > 9)) { die ('ERROR: I can only make between 1 and 9 sandwiches per order!'); } // process the data echo "I'm making you {$_POST['quantity']} sandwiches. Hope you can eat them all!"; } ?> </body> </html>
假定你得到的是一个数字,那么下一个步骤就是确认它是一个1到9之间的整型值。为了测试该数字是否是一个整型,我使用intval()函数从该值中取出其整数部分,然后用其和值本身做比较测试。浮点型值(比如2.5)将会测试失败;而整数值将会通过测试。在放行该值之前的最后一个步骤是检查其是否落在1到9之间。这个步骤很容易通过一系列不等测试来完成。
当涉及该主题时,strlen()函数也是值得提及的,该函数返回字符串的长度。它使得确认表单输入不会超出一定的长度可以非常容易地做到。下列例子演示了其是如何实现的:
这里,strlen()函数用于验证字符串输入既不会太长也不会太短。它也是确认输入数据满足你的数据库的字段长度约束的一种简便方法。举例而言,如果你有一个MySQL的VARCHAR(10)字段,长度上超过10个字符的字符串将会被缩减。strlen()函数可以在本例子中作为一个早期告警系统,该系统通知用户长度不匹配从而避免数据破坏。<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF']?>' method = 'post'> Enter a nickname 6-10 characters long: <br /> <input type = 'text' name = 'nick'> <br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check for required data // die if absent if (!isset($_POST['nick']) || trim($_POST['nick']) == '') { die ('ERROR: Come on, surely you can think of a nickname! How about Pooky?'); } // check if input is of the right length if (!(strlen($_POST['nick']) >= 6 && strlen($_POST['nick']) <= 10)) { die ("ERROR: That's either too long or too short!"); } // process the data echo "I'll accept the nickname {$_POST['nick']}, seeing as it's you!"; } ?> </body> </html>