PHP支持连接到许多不同数据库的函数,包括Oracle、Microsoft SQL Server和PostgreSQL。
通常,连接和查询这些数据库的基本原理是相同的。个别函数名称可能会有所不同,而且不同的数据库具有不同的功能,但是如果可以连接到MySQL,就应该能够很容易应用MySQL中的知识连接到其他数据库。
如果希望使用PHP还没有提供支持的特殊数据库,可以使用常规的ODBC函数。ODBC表示开放的数据库连接,它是连接数据库的标准。由于各种明显的原因,ODBC只具有任何函数集的有限功能。如果要求必须兼容所有数据库,就不能使用任何数据库的特殊功能。
除了PHP附带的函数库以外,一些可供使用的数据库抽象类,例如MDB2,允许为不同的数据库类型使用相同的函数名称。
使用常规的数据库接口:PEAR MDB2
接下来,我们将简要地介绍使用PEAR MDB2抽象层的例子。这是PEAR所有组件中使用最为广泛的组件之一。关于MDB2抽象层的安装,请参阅附录A中“PEAR的安装”一节的详细介绍。
为了便于比较,我们将介绍如何使用MDB2来编写搜索结果的脚本(见程序清单11-5)。
程序清单11-5 results_generic.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);
}
//set up for using PEAR MDB2
require_once('MDB2.php');
$user='bookorama';
$pass='bookorama123';
$host='localhost';
$db_name='books';
//set up universal connection string or DSN
$dsn="mysqli://".$user.":".$pass."@".$host."/".$db_name;
//connect to database
$db=&MDB2::connect($dsn);
//check if connection worked
if(MDB2::isError($db)){
echo$db->getMessage;
exit;
}
//perform query
$query="select*from books where".$searchtype."like'%".$searchterm."%'";
$result=$db->query($query);
//check that result was ok
if(MDB2::isError($result)){
echo$db->getMessage;
exit;
}
//get number of returned rows
$num_results=$result->numRows;
//display each returned row
for($i=0;$i<$num_results;$i++){
$row=$result->fetchRow(MDB2_FETCHMODE_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>";
}
//disconnect from database
$db->disconnect;
?>
</body>
</html>
下面,让我们看看以上代码与前面的代码有什么差异。
要连接数据库,我们使用了如下语句:
$db=MDB2::connect($dsn);
这个函数接收一个通用的连接字符串,该字符串包含了连接一个数据库所必需的所有参数。如果查看连接字符串的格式,可以看到这些参数:
$dsn="mysqli://".$user.":".$pass."@".$host."/".$db_name;
在完成数据库连接后,我们将使用isError检查该连接是否成功,如果失败,将打印错误信息并退出。
if(MDB2::isError($db)){
echo$db->getMessage;
exit;
}
假设所有操作都正确完成,我们将设置并执行一个查询,如下所示:
$result=$db->query($query);
我们可以检查返回的记录行数:
$num_results=$result->numRows;
按照以下代码取回每一行:
$row=$result->fetchRow(DB_FETCHMODE_ASSOC);
通用方法fetchRow可以以许多格式提取结果集中的一行;MDB2_FETCHMODE_ASSOC参数表示我们希望以相关数组方式返回结果行。
在输出查询结果行后,我们将关闭数据库连接:
$db->disconnect;
可以看到,这个例子非常类似于我们的第一个脚本。
使用MDB2的优点是只要记住一种数据库函数集,如果要改变数据库软件,只要对代码进行少量的修改就可以了。
既然这是一本介绍MySQL的图书,出于灵活性和速度的考虑,我们还将使用MySQL自带的本地函数库。但是,在项目中,当使用抽象层时,MDB2包所提供的抽象层特性将非常有用,因此我们可能会希望使用MDB2包。