在我们前面使用PHP的过程中,使用了普通文件来存储与检索数据。第2章中介绍这种文件时,我们提到了在Web应用中使用关系数据系统可以使得这些存储和检索操作变得更容易、更安全、更有效。现在,在已经使用了MySQL创建数据库后,我们可以开始通过基于Web的前台来连接该数据库。
在本章中,我们将介绍如何使用PHP从Web访问Book-O-Rama数据库。我们将学习到如何从数据库读取数据和将数据写入数据库,以及如何过滤潜在的、可能造成麻烦的输入数据。
在本章中,我们将主要介绍以下内容:
■Web数据库架构的工作原理
■通过Web查询数据库的基本步骤
■建立数据库连接
■获取关于可用数据库的信息
■选择要使用的数据库
■查询数据库
■检索查询结果
■与数据库断开连接
■在数据库中插入新信息
■使用prepared语句
■使用PHP与数据库交互的其他接口
■使用常规的数据库接口:PEAR MDB2
11.1 Web数据库架构的工作原理
在第8章中,我们简单地介绍了数据库架构的工作原理,作为一个简单的回顾,在这里,我们给出如下所示的基本步骤:
1)一个用户的浏览器发出一个HTTP请求,请求特定的Web页面。例如,用户中能使用一个HTML表单请求搜索Book-O-Rama数据库中所有由Michael Morgan编写的书籍。该搜索结果页面为results.php。
2)Web服务器接收到对results.php页面的请求后,检索该文件,并将其传递给PHP引擎处理。
3)PHP引擎开始解析脚本。脚本主要包括了连接到数据库和执行查询的命令(执行对书籍的搜索)。PHP启动了对MySQL服务器的连接并向该服务器发送适当的查询。
4)MySQL服务器接收到数据库查询的请求,开始处理这个查询,并将查询结果(一个书籍的列表)返回给PHP引擎。
5)PHP引擎完成了脚本的运行后(其中包括以HTML格式表示经过处理后的查询结果),然后将该HTML返回给Web服务器。
6)Web服务器再将HTML返回给客户端浏览器,用户就可以看到所要求查询的书籍。现在,我们已经有了一个MySQL数据库,因此就可以编写PHP代码来执行上述步骤。我们从搜索表单开始。这个搜索表单是一个普通的HTML表单。代码如程序清单11-1所示。
程序清单11-1 search.html——Book-O-Rama的数据库搜索页
<html>
<head>
<title>Book-O-Rama Catalog Search</title>
</head>
<body>
<h1>Book-O-Rama Catalog Search</h1>
<form action=/"results.php/"method=/"post/">
Choose Search Type:<br/>
<select name=/"searchtype/">
<option >Author</option>
<option >Title</option>
<option >ISBN</option>
</select>
<br/>
Enter Search Term:<br/>
<input name=/"searchterm/"type=/"/"text/"size=/"40/"/>
<br/>
<input type=/"submit/"name=/"submit/"/>
</form>
</body>
</html>
这是一个非常直观的HTML表单。其输出结果如图11-1所示。
图 11-1 搜索表单非常简单,可以根据书籍的标题、作者或ISBN号进行搜索当点击/"Search/"(搜索)按钮时,将调用results.php脚本。程序清单11-2给出完整代码。在本章的后续内容中,我们将讨论该脚本的功能及其工作原理。
程序清单11-2 results.php——从MySQL数据库获取并格式化搜索结果,以便显示结果
<html>
<head>
<title>Book-O-Rama Search Results</title>
</head>
<body>
<h1>Book-O-Rama Search Results</h1>
<?php
//create short variable names
$searchtype=$_POST[/'searchtype/'];
$searchterm=trim($_POST[/'searchterm/']);
if(!$searchtype||!$searchterm){
echo/'You have not entered search details.Please go back and try again./';
exit;
}
if(!get_magic_quotes_gpc){
$searchtype=addslashes($searchtype);
$searchterm=addslashes($searchterm);
}
@$db=new mysqli(/'localhost/',/'bookorama/',/'bookorama123/',/'books/');
if(mysqli_connect_errno){
echo/'Error:Could not connect to database.Please try again later./';
exit;
}
$query=/"select*from books where/".$searchtype./"like/'%/".$searchterm./"%/'/";
$result=$db->query($query);
$num_results=$result->num_rows;
echo/"<p>Number of books found:/".$num_results./"</p>/";
for($i=0;$i<$num_results;$i++){
$row=$result->fetch_assoc;
echo/"<p><strong>/".($i+1)./".Title:/";
echo htmlspecialchars(stripslashes($row[/'title/']));
echo/"</strong><br/>Author:/";
echo stripslashes($row[/'author/']);
echo/"<br/>ISBN:/";
echo stripslashes($row[/'isbn/']);
echo/"<br/>Price:/";
echo stripslashes($row[/'price/']);
echo/"</p>/";
}
$result->free;
$db->close;
?>
</body>
</html>
请注意,以上脚本允许输入MySQL通配符%和_。这个功能对用户来说是非常有用的。如果它会给应用程序带来问题,你就必须对字符转义。
图11-2给出了该脚本执行搜索操作以后的结果。
图 11-2 在Web页面中显示了运行result.php脚本搜索到的关于Java的书籍