技术开发 频道

PHP开发经典教程:垃圾处理

空容器 

    本教程假定将要被验证的用户输入通过一个Web表单来获得。这不是PHP脚本可以获得用户数据的唯一方法;然而,它是最常见的方法。如果你的PHP应用程序需要验证命令行输入,那么我建议你阅读我的关于PEAR Console_Getopt类的文章,你可在http://www.zend.com/pear/tutorials/Console-Getopt.php中仔细阅读它。
 
    将诸如JavaScript或者VBScript的客户端脚本语言用于客户端表单验证是一种惯例。然而,这种客户端验证的类型不是十分可靠的。因为你无法控制客户端,因此如果用户关闭其浏览器中的JavaScript,那么你为了保证用户没有输入不相关的数据所做的全部努力变得不相关了。那就是为什么最有经验的开发人员使用客户端和服务器端两种验证方法的原因。服务器端验证涉及检查通过PHP脚本被递交给服务器端的值然后当输入不正确时采取适当的动作。
 
    让我们以最常见的输入错误开始:一个漏掉了其所要求的必须的值的表单字段。请看这个例子:
<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF'] ?>' method = 'post'> Which sandwich filling would you like? <br /> <input type = 'text' name = 'filling'> <br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // set database variables $host = 'localhost'; $user = 'user'; $pass = 'secret'; $db = 'sandwiches'; // get user input $filling = mysql_escape_string($_POST['filling']); // open connection $connection = mysql_connect($host, $user, $pass) or die('Unable to connect!'); // select database mysql_select_db($db) or die('Unable to select database!'); // create query $query = 'INSERT INTO orders (filling) VALUES ("$filling")'; // execute query $result = mysql_query($query) or die("Error in query: $query. ".mysql_error()); // close connection mysql_close($connection); // display message echo "Your {$_POST['filling']} sandwich is coming right up!"; } ?> </body> </html>
    上面例子中,可以很明显的看到,递交没有输入任意数据的表单将会导致一条空记录被增加到数据库中(假定目标表格中没有NOT NULL约束)。为了避免这种情况,确认实际上表单包含了有效数据然后执行INSERT查询是重要的。下面是其如何实现的:
<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF'] ?>' method = 'post'> Which sandwich filling would you like? <br /> <input type = 'text' name = 'filling'> <br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check for required data // die if absent if (!isset($_POST['filling']) || trim($_POST['filling']) == '') { die("ERROR: You can't have a sandwich without a filling!"); } else { $filling = mysql_escape_string(trim($_POST['filling'])); } // set database variables $host = 'localhost'; $user = 'user'; $pass = 'secret'; $db = 'sandwiches'; // open connection $connection = mysql_connect($host, $user, $pass) or die('Unable to connect!'); // select database mysql_select_db($db) or die('Unable to select database!'); // create query $query = 'INSERT INTO orders (filling) VALUES ("$filling")'; // execute query $result = mysql_query($query) or die("Error in query: $query. ".mysql_error()); // close connection mysql_close($connection); // display message echo "Your {$_POST['filling']} sandwich is coming right up!"; } ?> </body> </html>
    这里的错误检查既简单又符合逻辑:trim()函数用于裁剪字段值首部和尾部的空格,然后该字段和一个空字符串进行比较。如果该匹配为真,那么该字段空值递交,然后脚本在MySQL被影响之前以一个错误消息结束。
 
    尤其是在新手中一个常见的错误就是以一个告诉你一个变量是否为空的对PHP的empty()函数的调用来代替isset()和trim()的结合。这通常情况下不是一个好主意,因为empty()有一个致命的缺陷:即使一个变量包含数值0,它也会返回真。下列这个简单的例子对此做了解释说明:
<?php // no data, returns empty $data = ''; echo empty($data) ? "$data is empty" : "$data is not empty"; echo "<br />\n"; // some data, returns not empty $data = '1'; echo empty($data) ? "$data is empty" : "$data is not empty"; echo "<br />\n"; // some data, returns empty $data = '0'; echo empty($data) ? "$data is empty" : "$data is not empty"; ?>
    所以,如果你的表单字段只允许持有非空、非零数据,那么empty()是一个验证数据的好选择。但如果你的字段的有效值的范围包括数值0,那么请用isset()和trim()的结合。
0
相关文章