在任何用于从Web访问数据库的脚本中,都应该遵循以下这些基本步骤:
1)检查并过滤来自用户的数据。
2)建立一个到适当数据库的连接。
3)查询数据库。
4)获取查询结果。
5)将结果显示给用户。
这些是我们在脚本results.php中已经遵循的步骤,在接下来的内容中,我们将逐个详细介绍。
11.2.1 检查与过滤用户输入数据
首先,我们将过滤用户可能在其搜索条件的起始或结束位置不小心输入的空白字符。过滤操作是通过对$_POST['searchterm']变量定义简短名称变量的值应用trim函数来实现的。
$searchterm=trim($_POST['searchterm']);
接下来,我们将验证用户已经输入搜索条件并选择了搜索类型。请注意,我们是在过滤了$searchterm两端的空白字符之后再检查用户是否已经输入一个查询条件。如果将这几行代码的顺序颠倒,我们将遇到用户的搜索条件不为空时的情况,因此这不会产生一个错误信息,但是如果都是空白字符,trim函数将删除它们:
if(!$searchtype||!$searchterm){
echo"You have not entered search details.Please go back and try again.";
exit;
}
我们已经检查了$searchtype变量,尽管在这个例子中,它来自一个HTML SELECT。你可能要问,为什么我们要这么麻烦来检查这些必须由用户输入的数据。请记住,可能有多个接口可以连接到数据库。例如,Amazon(亚马逊)的许多会员会都使用他们自己的界面。同样,因为用户从不同的界面进入,这样就可能会导致安全问题。
当准备使用用户输入的任何数据时,也要适当地过滤一些控制字符。回顾前面所介绍的,在第4章中,我们介绍了addslashes函数、stripslashes函数和get_magic_quotes_gpc函数。当将用户输入数据提交到一个数据库(例如MySQL)时,必须转义数据。
在这个例子中,我们检查了get_magic_quotes_gpc函数的返回值。它告诉我们是否已经自动完成了引号。如果还没有,可以使用addslashes函数来过滤数据:
if(!get_magic_quotes_gpc){
$searchtype=addslashes($searchtype);
$searchterm=addslashes($searchterm);
}
我们也可以对来自数据库的数据调用stripslashes。如果魔术引号特性没有打开,从数据库出来的数据将包含反斜杠,因此必须过滤这些反斜杠。
我们使用函数htmlspecialchars对HTML中的特殊意义字符进行编码。我们当前的测试不包含下列任何符号:与号&、小号(<)、大于号(>)或双引号("),但是许多美观的图书标题包含&号。通过使用该函数,可以清除将来可能发生的错误。