韶华将逝,雄心未已;欲与众君,共习此技.
《PHP和MySQL Web开发》学习笔记(十三)
上一篇 / 下一篇 2007-09-05 13:13:15 / 天气: 晴朗 / 心情: 平静 / 个人分类:PHP & MySQL
11.2 从Web查询数据库的基本步骤
在任何用于从Web访问数据库的脚本中,都应该遵循以下这些基本步骤:
在任何用于从Web访问数据库的脚本中,都应该遵循以下这些基本步骤:
1)检查并过滤来自用户的数据。
2)建立一个到适当数据库的连接。
3)查询数据库。
4)获取查询结果。
5)将结果显示给用户。
2)建立一个到适当数据库的连接。
3)查询数据库。
4)获取查询结果。
5)将结果显示给用户。
11.3 检查与过滤用户输入数据
首先,我们将过滤用户可能在其搜索条件的起始或结束位置不小心输入的空白字符。过滤操作是通过对$searchterm输入字符串执行trim()函数来实现的。
$searchterm=trim($searchterm);
接下来,我们将验证用户已经输入搜索条件和搜索类型。请注意,我们是在过滤了$searchterm两端的空白字符之后再检查用户是否已经输入一个查询条件。如果将这几行代码的顺序颠倒,我们将遇到用户的搜索条件不是为空时的情况,因此这不会产生一个错误信息,但是如果都是空白字符,trim()函数将删除它们。
if (!$searchtype || $searchterm) {
echo 'You have not entered seach details. Please go back and try again.';
}
我们已经检查了searchtype变量,尽管在这个例子中,它来自一个HTML SELECT。你可能要问,为什么我们要这么麻烦来检查这些必须由用户输入的数据。请记住,可能有多个接口以连接到数据库。因为用户会从不同的界面进入,这样就可能会导致安全问题。
同样,当准备使用用户输入的任何数据时,也要适当地过滤一些控制字符。
在这个例子中,我们检查了get_magci_quotes_gpc()函数的返回值。它告诉我们是否已经自动完成了引号。如果还没有,可以使用addslashes()函数来过滤数据。
if (!get_magic_quotes_gpc()) {
$searchtype = addslashes($searchtype);
$searchterm = addslashes($searchterm);
}
我们也可以对来自数据库的数据调用stripslashes()。如果魔术引号特性没有打开,从数据库出来的数据将包含反斜杠,因此必须过滤这些反斜杠。
我们使用函数htmlspecialchars()对HTML中的特殊意义字符进行编码。我们当前的测试不包含下列任何符号:与号&,小于号(<)、大于号(>)或双引号("),但是许多美观的图书标题包含&号。通过使用该函数,可以清除将来可能发生的错误。
首先,我们将过滤用户可能在其搜索条件的起始或结束位置不小心输入的空白字符。过滤操作是通过对$searchterm输入字符串执行trim()函数来实现的。
$searchterm=trim($searchterm);
接下来,我们将验证用户已经输入搜索条件和搜索类型。请注意,我们是在过滤了$searchterm两端的空白字符之后再检查用户是否已经输入一个查询条件。如果将这几行代码的顺序颠倒,我们将遇到用户的搜索条件不是为空时的情况,因此这不会产生一个错误信息,但是如果都是空白字符,trim()函数将删除它们。
if (!$searchtype || $searchterm) {
echo 'You have not entered seach details. Please go back and try again.';
}
我们已经检查了searchtype变量,尽管在这个例子中,它来自一个HTML SELECT。你可能要问,为什么我们要这么麻烦来检查这些必须由用户输入的数据。请记住,可能有多个接口以连接到数据库。因为用户会从不同的界面进入,这样就可能会导致安全问题。
同样,当准备使用用户输入的任何数据时,也要适当地过滤一些控制字符。
在这个例子中,我们检查了get_magci_quotes_gpc()函数的返回值。它告诉我们是否已经自动完成了引号。如果还没有,可以使用addslashes()函数来过滤数据。
if (!get_magic_quotes_gpc()) {
$searchtype = addslashes($searchtype);
$searchterm = addslashes($searchterm);
}
我们也可以对来自数据库的数据调用stripslashes()。如果魔术引号特性没有打开,从数据库出来的数据将包含反斜杠,因此必须过滤这些反斜杠。
我们使用函数htmlspecialchars()对HTML中的特殊意义字符进行编码。我们当前的测试不包含下列任何符号:与号&,小于号(<)、大于号(>)或双引号("),但是许多美观的图书标题包含&号。通过使用该函数,可以清除将来可能发生的错误。
11.4 建立一个连接
PHP5为连接MySQL提供了新的函数库。这个函数库是mysqli(i表示改进)。这个函数库适用于MysQL版本4及其以后版本。在版本4中,MySQL添加了一个新的连接协议,其执行速度更快,而且mysqli允许使用它。mysqli函数库允许使用面向对象或面向过程的语法。
在脚本中,我们使用如下语句连接MySQL服务器:
@ $db = new mysqli('localhost', 'bookorama', 'bookorama123', 'books');
以上代码实例化了mysqli类并且创建了到主机'localhost'的连接,该连接使用的用户名和密码分别是:'bookorama'和'bookorama123'。该连接被设置成使用books数据库。
使用这种面向对象的方法,可以调用这个对象的方法来访问数据库。如果你喜欢过程方法,mysqli也提供了这个选项。要以过程方式连接,可以使用:
@ $db = mysqli_connect('localhost', 'bookorama', 'bookorama123', 'books');
这个函数将返回一个资源,而不是一个对象。这个资源表示到数据库的连接,而且如果使用过程方法,必须将这个资源传递到mysqli的所有其他函数。
请注意,当连接到数据库时,我们通常会以错误抑制操作@作为第一行代码。这样,可以很巧妙地处理任何错误。(这也可以通过异常来处理,我们只是没有在这个简单的例子中使用。)
请记住,MySQL对同时连接数据库的连接数量有一定的限制。MySQL参数max_connections决定了同时连接的个数,该参数和相关的Apache参数MaxClients的作用是,告诉服务器拒绝新的连接请求,从而确保系统资源不会在系统忙碌的时候,或软件瘫痪的时候被请求和使用。
PHP5为连接MySQL提供了新的函数库。这个函数库是mysqli(i表示改进)。这个函数库适用于MysQL版本4及其以后版本。在版本4中,MySQL添加了一个新的连接协议,其执行速度更快,而且mysqli允许使用它。mysqli函数库允许使用面向对象或面向过程的语法。
在脚本中,我们使用如下语句连接MySQL服务器:
@ $db = new mysqli('localhost', 'bookorama', 'bookorama123', 'books');
以上代码实例化了mysqli类并且创建了到主机'localhost'的连接,该连接使用的用户名和密码分别是:'bookorama'和'bookorama123'。该连接被设置成使用books数据库。
使用这种面向对象的方法,可以调用这个对象的方法来访问数据库。如果你喜欢过程方法,mysqli也提供了这个选项。要以过程方式连接,可以使用:
@ $db = mysqli_connect('localhost', 'bookorama', 'bookorama123', 'books');
这个函数将返回一个资源,而不是一个对象。这个资源表示到数据库的连接,而且如果使用过程方法,必须将这个资源传递到mysqli的所有其他函数。
请注意,当连接到数据库时,我们通常会以错误抑制操作@作为第一行代码。这样,可以很巧妙地处理任何错误。(这也可以通过异常来处理,我们只是没有在这个简单的例子中使用。)
请记住,MySQL对同时连接数据库的连接数量有一定的限制。MySQL参数max_connections决定了同时连接的个数,该参数和相关的Apache参数MaxClients的作用是,告诉服务器拒绝新的连接请求,从而确保系统资源不会在系统忙碌的时候,或软件瘫痪的时候被请求和使用。
11.5 选择使用的数据库
请记住,当我们通过命令行界面使用MySQL的时候,需要告诉它要使用哪个数据库,命令如下所示:
$db->select_db(dbname) 或 mysqli_select(db_resource, db_name)
这里,可以看到以上代码与我们前面介绍的函数类似:过程版本的函数名称以mysqli_开始,需要额外的数据库句柄参数。
请记住,当我们通过命令行界面使用MySQL的时候,需要告诉它要使用哪个数据库,命令如下所示:
$db->select_db(dbname) 或 mysqli_select(db_resource, db_name)
这里,可以看到以上代码与我们前面介绍的函数类似:过程版本的函数名称以mysqli_开始,需要额外的数据库句柄参数。
11.6 查询数据库
要执行数据库查询,可以使用mysqli_query()函数。但是,在使用之前,最好建立要运行的查询:
$query = "select * from books where $searchtype like '%$searchterm%'";
在这个例子中,我们将在用户指定字段($searchtype)中搜索用户输入值($searchterm)。注意我们使用了相似(like)逻辑用于匹配而不是相等逻辑——在数据库搜索的时候条件要更宽松,这是需要注意的。
提示:请记住,发送给MySQL的查询不需要在后面加一个分号,这与在MySQL监视程序输入查询有所不同。
现在,我们可以运行如下查询:$result = $db->query($query);
或者,如果希望使用过程版本的函数,可以使用:$result = mysqli_query($db, $query);
要执行数据库查询,可以使用mysqli_query()函数。但是,在使用之前,最好建立要运行的查询:
$query = "select * from books where $searchtype like '%$searchterm%'";
在这个例子中,我们将在用户指定字段($searchtype)中搜索用户输入值($searchterm)。注意我们使用了相似(like)逻辑用于匹配而不是相等逻辑——在数据库搜索的时候条件要更宽松,这是需要注意的。
提示:请记住,发送给MySQL的查询不需要在后面加一个分号,这与在MySQL监视程序输入查询有所不同。
现在,我们可以运行如下查询:$result = $db->query($query);
或者,如果希望使用过程版本的函数,可以使用:$result = mysqli_query($db, $query);
11.7 检索查询结果
我们可以使用不同的函数以不同的方式将查询结果从结果对象或标识符中取出来。结果对象或标识答是访问查询返回行的关键。
在这个例子中,我们统计了所返回记录行的行数,并且使用了mysqli_fetch_assoc()函数。
当使用面向对象方法时,返回的行数保存在结果对象的num_rows成员变量中,可以通过以下形式访问它:$num_results = $result->num_rows;
当使用一个过程方法时,函数mysqli_num_rows()给出了查询返回的行数。你应该把它传给结果标识符,如下所示:$num_results = mysqli_num_rows($result);
了解这一点是有用的——如果计划处理或显示该结果,现在可以知道这些结果有多少,并且通过一个循环就可以完成:
for ($i=0; $i<$num_results; $i++) {
// process results
}
在每轮循环中,我们都将调用$result->fetch_assoc()函数(或mysqli_fetch_assoc()函数)。如果没有返回行,该循环将停止执行。该函数接受结果集合中每一行并能一个相关数组返回该行,每个关键词为一个属性名,每个值为数组中相应的值:$row = $result->fetch_assoc();
或者可以使用过程方法:$row = mysqli_fetch_assoc($result);
给定相关数组$row,我们可以遍历每个字段并适当地显示它们,例如:
echo '<br />ISBN: ';
echo stripslashes($row['isbn']);
如前所述,我们调用stripslashes()函数以便在显示前整理其值。
从结果标识符中获取查询结果有几种不同的方法。不使用相关数组,可以使用函数mysqli_fetch_row()将结果取回到一个列举数组中,如下所示:$row = $result->fetch_row($result);
或者:$row = mysqli_fetch_row($result);
这里,属性值将在每个数组值$row[0]、$row[1]等等的里面列出(mysqli_fetch_array()函数允许获取一行,作为两种数组之一,或作为两种数组)。
也可以使用mysqli_fetch_object()函数将一行取回到一个对象中:$row = $result->fetch_object();
或者:$row = mysqli_fetch_object($result);
然后,通过$row->title、$row->author等访问每个属性。
我们可以使用不同的函数以不同的方式将查询结果从结果对象或标识符中取出来。结果对象或标识答是访问查询返回行的关键。
在这个例子中,我们统计了所返回记录行的行数,并且使用了mysqli_fetch_assoc()函数。
当使用面向对象方法时,返回的行数保存在结果对象的num_rows成员变量中,可以通过以下形式访问它:$num_results = $result->num_rows;
当使用一个过程方法时,函数mysqli_num_rows()给出了查询返回的行数。你应该把它传给结果标识符,如下所示:$num_results = mysqli_num_rows($result);
了解这一点是有用的——如果计划处理或显示该结果,现在可以知道这些结果有多少,并且通过一个循环就可以完成:
for ($i=0; $i<$num_results; $i++) {
// process results
}
在每轮循环中,我们都将调用$result->fetch_assoc()函数(或mysqli_fetch_assoc()函数)。如果没有返回行,该循环将停止执行。该函数接受结果集合中每一行并能一个相关数组返回该行,每个关键词为一个属性名,每个值为数组中相应的值:$row = $result->fetch_assoc();
或者可以使用过程方法:$row = mysqli_fetch_assoc($result);
给定相关数组$row,我们可以遍历每个字段并适当地显示它们,例如:
echo '<br />ISBN: ';
echo stripslashes($row['isbn']);
如前所述,我们调用stripslashes()函数以便在显示前整理其值。
从结果标识符中获取查询结果有几种不同的方法。不使用相关数组,可以使用函数mysqli_fetch_row()将结果取回到一个列举数组中,如下所示:$row = $result->fetch_row($result);
或者:$row = mysqli_fetch_row($result);
这里,属性值将在每个数组值$row[0]、$row[1]等等的里面列出(mysqli_fetch_array()函数允许获取一行,作为两种数组之一,或作为两种数组)。
也可以使用mysqli_fetch_object()函数将一行取回到一个对象中:$row = $result->fetch_object();
或者:$row = mysqli_fetch_object($result);
然后,通过$row->title、$row->author等访问每个属性。
11.8 从数据库断开连接
通过调用如下语句,可以释放结果集:$result -> free();
或者:mysqli_free_result($result);
然后可以使用:$db->close();
或者:mysqli_close($db);
来关闭一个数据库。严格地说,这并不是必要的,因为脚本执行完毕的时候它们将被自动关闭。
通过调用如下语句,可以释放结果集:$result -> free();
或者:mysqli_free_result($result);
然后可以使用:$db->close();
或者:mysqli_close($db);
来关闭一个数据库。严格地说,这并不是必要的,因为脚本执行完毕的时候它们将被自动关闭。
11.9 将新信息放入数据库
显然,将新数据插入到数据库与从数据库中取回数据是相似的。我们可以遵循同样的基本步骤——建立一个连接、发送查询,最后检查结果。在这种情况中,发送的查询是INSERT而不是SELECT。
用一个基本HTML表单来完成,它可以用来在数据库中输入新的图书。该表单的结果将传递给insert_book.php,此脚本接收图书细节,执行一些小的验证,并尝试将数据写入到数据库中。(脚本略。)
当价格以浮点数的形式保存在数据库时,我们不希望在小数点的前后插入斜杠。通过调用doubleval()函数,可以对该数字字段进行过滤,从而去除所有的临时字符。
在这里,我们再次通过实例化mysqli对象来连接数据库,而且设置了一个发送给数据库的查询。在这个例子中,该查询是一个SQL INSERT操作:
$query = "insert into books values ('$isbn', '$author', '$title', '$price')";
$result = $db->query($query);
通过调用$db->query()(或者mysqli_query(),如果希望使用过程式方法),该查询将以常见的方式在数据库上执行。
使用INSERT和SELECT的一个显著不同之处在于对mysqli_affected_rows()的使用,这是一个过程式版本的函数或者面向对象版本中的一个类成员变量:echo $db->affected_rows.' book(s) inserted into database.';
在前面的脚本中,我们使用mysqli_num_rows()来确定SELECT操作可以返回多少行记录。当编写一个修改数据库的查询时,例如INSERT、DELETE和UPDATE,应该使用mysqli_affected_rows()函数。
显然,将新数据插入到数据库与从数据库中取回数据是相似的。我们可以遵循同样的基本步骤——建立一个连接、发送查询,最后检查结果。在这种情况中,发送的查询是INSERT而不是SELECT。
用一个基本HTML表单来完成,它可以用来在数据库中输入新的图书。该表单的结果将传递给insert_book.php,此脚本接收图书细节,执行一些小的验证,并尝试将数据写入到数据库中。(脚本略。)
当价格以浮点数的形式保存在数据库时,我们不希望在小数点的前后插入斜杠。通过调用doubleval()函数,可以对该数字字段进行过滤,从而去除所有的临时字符。
在这里,我们再次通过实例化mysqli对象来连接数据库,而且设置了一个发送给数据库的查询。在这个例子中,该查询是一个SQL INSERT操作:
$query = "insert into books values ('$isbn', '$author', '$title', '$price')";
$result = $db->query($query);
通过调用$db->query()(或者mysqli_query(),如果希望使用过程式方法),该查询将以常见的方式在数据库上执行。
使用INSERT和SELECT的一个显著不同之处在于对mysqli_affected_rows()的使用,这是一个过程式版本的函数或者面向对象版本中的一个类成员变量:echo $db->affected_rows.' book(s) inserted into database.';
在前面的脚本中,我们使用mysqli_num_rows()来确定SELECT操作可以返回多少行记录。当编写一个修改数据库的查询时,例如INSERT、DELETE和UPDATE,应该使用mysqli_affected_rows()函数。
11.10 使用Prepared语句
mysqli函数库支持prepared语句的使用。它们对于在执行尤其是具有不同数据的相同查询时,可以提高执行速度。它们也可以免受SLQ注射风格(injection-style)的攻击。
prepared语句的基本思想是可以向MySQL发送一个需要执行的查询模板,然后再单独发送数据。我们可以向相同的Prepared语句发布大量的相同数据;这个特性对批处理的插入操作来说是非常有用的。
在insert_book.php脚本中,可以使用prepared语句,如下所示:
$query = "insert into books values(?, ?, ?, ?)";
$stmt = $db->prepare($query);
$stmt->bind_param("sssd", $isbn, $author, $title, $price);
$stmt->execute();
echo $stmt->affected_rows.' book inserted into database.';
$stmt->close();
下面,我们逐行分析以上代码。
当设置查询时,不是替换前面已经生成的变量,而是在每一段数据的位置设置问号。在这些问号的周围,不能再设置问号或其他分界符号。
第二行是调用$db->prepare(),在过程版本中,是通过mysqli_stmt_prepare()函数实现的。这一行将构建一个语句对象或需要用来完成实际处理的资源。
语句对象有一个bind_param()方法。(在过程版本中,是mysqli_stmt_bind_param()函数)。bind_param()的用途是告诉PHP那些变量应该被问号所替换。第一个参数是一个格式化字符串,与printf()使用的格式化字符串不同。在这里,所传递的值意味着4个参数分别是字符串、字符串、字符串、字符串和双精度。格式化字符串中的其他可能字符还有:i表示整数,b表示blob。在这个参数之后,必须列出与语句中的问号数量相同的变量。它们将依次被替换。
调用$stmt->execute()函数(在过程版本中是mysqli_stmt_excute()函数)将真正运行这个查询。我们可以访问受影响的行数并关闭这个语句。
那么Prepared语句的作用如何呢?这里,一个优点是可以改变这4个绑定变量的值,并且在不用准备的情况下重新执行这个语句。这个功能对于循环执行批量插入操作来说是非常有用的。
与绑定参数一样,也可以绑定结果。对于SELECT类型查询,可以使用$stmt->bind_result()函数(或mysqli_stmt_bind_result()函数)提供希望填充结果列的变量列表。每次调用$stmt->fetch()函数(或者mysqli_stmt_fetch()函数)时,结果集下一行的列值将被填充到这些绑定变量中。例如,在前面介绍的图书搜索脚本中,可以使用:
$stmt->bind_result($isbn, $author, $title, $price);
将这四个变量绑定到将通过查询返回的4列。在调用如下语句后:$stmt->execute();
可以在循环中调用:$stmt->fetch();
每当该语句被调用时,它将获得下一个结果行,并填充到4个绑定变量中。
mysqli函数库支持prepared语句的使用。它们对于在执行尤其是具有不同数据的相同查询时,可以提高执行速度。它们也可以免受SLQ注射风格(injection-style)的攻击。
prepared语句的基本思想是可以向MySQL发送一个需要执行的查询模板,然后再单独发送数据。我们可以向相同的Prepared语句发布大量的相同数据;这个特性对批处理的插入操作来说是非常有用的。
在insert_book.php脚本中,可以使用prepared语句,如下所示:
$query = "insert into books values(?, ?, ?, ?)";
$stmt = $db->prepare($query);
$stmt->bind_param("sssd", $isbn, $author, $title, $price);
$stmt->execute();
echo $stmt->affected_rows.' book inserted into database.';
$stmt->close();
下面,我们逐行分析以上代码。
当设置查询时,不是替换前面已经生成的变量,而是在每一段数据的位置设置问号。在这些问号的周围,不能再设置问号或其他分界符号。
第二行是调用$db->prepare(),在过程版本中,是通过mysqli_stmt_prepare()函数实现的。这一行将构建一个语句对象或需要用来完成实际处理的资源。
语句对象有一个bind_param()方法。(在过程版本中,是mysqli_stmt_bind_param()函数)。bind_param()的用途是告诉PHP那些变量应该被问号所替换。第一个参数是一个格式化字符串,与printf()使用的格式化字符串不同。在这里,所传递的值意味着4个参数分别是字符串、字符串、字符串、字符串和双精度。格式化字符串中的其他可能字符还有:i表示整数,b表示blob。在这个参数之后,必须列出与语句中的问号数量相同的变量。它们将依次被替换。
调用$stmt->execute()函数(在过程版本中是mysqli_stmt_excute()函数)将真正运行这个查询。我们可以访问受影响的行数并关闭这个语句。
那么Prepared语句的作用如何呢?这里,一个优点是可以改变这4个绑定变量的值,并且在不用准备的情况下重新执行这个语句。这个功能对于循环执行批量插入操作来说是非常有用的。
与绑定参数一样,也可以绑定结果。对于SELECT类型查询,可以使用$stmt->bind_result()函数(或mysqli_stmt_bind_result()函数)提供希望填充结果列的变量列表。每次调用$stmt->fetch()函数(或者mysqli_stmt_fetch()函数)时,结果集下一行的列值将被填充到这些绑定变量中。例如,在前面介绍的图书搜索脚本中,可以使用:
$stmt->bind_result($isbn, $author, $title, $price);
将这四个变量绑定到将通过查询返回的4列。在调用如下语句后:$stmt->execute();
可以在循环中调用:$stmt->fetch();
每当该语句被调用时,它将获得下一个结果行,并填充到4个绑定变量中。
11.11 使用PHP与数据库交互的其他接口
PHP支持连接到许多不同数据库的函数,包括Oracle、Microsoft SQL Server和PostgreSQL。
通常,连接和查询这些数据库的基本原理是相同的。个别函数名称可能会有所不同,而且不同的数据库具有不同的功能,但是如果可以连接到MySQL,就应该能够很容易应用MySQL中的知识连接到其他数据库。
如果希望使用PHP还没有提供支持的特殊数据库,可以使用常规的ODBC函数。ODBC表示开放的数据库连接,它是连接数据库的标准。
除了PHP附带的函数库以外,一些可供使用的数据库抽象类,例如PEAR::DB,允许为不同的数据库类型使用相同的函数名称。
PHP支持连接到许多不同数据库的函数,包括Oracle、Microsoft SQL Server和PostgreSQL。
通常,连接和查询这些数据库的基本原理是相同的。个别函数名称可能会有所不同,而且不同的数据库具有不同的功能,但是如果可以连接到MySQL,就应该能够很容易应用MySQL中的知识连接到其他数据库。
如果希望使用PHP还没有提供支持的特殊数据库,可以使用常规的ODBC函数。ODBC表示开放的数据库连接,它是连接数据库的标准。
除了PHP附带的函数库以外,一些可供使用的数据库抽象类,例如PEAR::DB,允许为不同的数据库类型使用相同的函数名称。
11.12 使用常规的数据库接口:PEAR DB
接下来,我们将简要介绍使用PEAR DB抽象层的例子。这是PEAR的核心组件之一,而且很可能是PEAR所有组件中使用最为广泛的组件。如果已经安装了PEAR,就已经安装了DB。
我们用DB来编写搜索结果的脚本。(脚本略。)
要连接数据库,我们使用了如下语句:$db = DB::connect($dsn);
这个函数接收一个通用的连接字符串,该字符串包含了连接一个数据库所必需的所有参数。如果查看连接字符串的格式,可以看到这些参数:$dsn = "mysqli://$user:$pass@$host/$db_name";
在完成数据库连接后,我们将使用isError()检查该连接是否成功,如果失败,将打印错误信息并退出。
if (DB::isError($db)) {
echo $db->getMessage();
exit;
}
假设所有操作都正确完成,我们将设置并执行一个查询,如下所示:$result = $db->query($query);
我们可以检查返回的记录行数:$num_results = $result->numRows();
按照以下代码取回每一行:$row = $result->fetchRow(DB_FETCHMODE_ASSOC);
通用方法fetchRow()可以以许多不同的格式提取结果集中的一行;DB_FETCHMODE_ASSOC参数表示我们希望以相关数组方式返回结果行。
在输出查询结果行后,我们将关闭数据库连接:$db->disconnect();
使用DB的优点是只要记住一种数据库函数集,如果要改变数据库软件,只要对代码进行少量的修改就可以了。
接下来,我们将简要介绍使用PEAR DB抽象层的例子。这是PEAR的核心组件之一,而且很可能是PEAR所有组件中使用最为广泛的组件。如果已经安装了PEAR,就已经安装了DB。
我们用DB来编写搜索结果的脚本。(脚本略。)
要连接数据库,我们使用了如下语句:$db = DB::connect($dsn);
这个函数接收一个通用的连接字符串,该字符串包含了连接一个数据库所必需的所有参数。如果查看连接字符串的格式,可以看到这些参数:$dsn = "mysqli://$user:$pass@$host/$db_name";
在完成数据库连接后,我们将使用isError()检查该连接是否成功,如果失败,将打印错误信息并退出。
if (DB::isError($db)) {
echo $db->getMessage();
exit;
}
假设所有操作都正确完成,我们将设置并执行一个查询,如下所示:$result = $db->query($query);
我们可以检查返回的记录行数:$num_results = $result->numRows();
按照以下代码取回每一行:$row = $result->fetchRow(DB_FETCHMODE_ASSOC);
通用方法fetchRow()可以以许多不同的格式提取结果集中的一行;DB_FETCHMODE_ASSOC参数表示我们希望以相关数组方式返回结果行。
在输出查询结果行后,我们将关闭数据库连接:$db->disconnect();
使用DB的优点是只要记住一种数据库函数集,如果要改变数据库软件,只要对代码进行少量的修改就可以了。
11.13 进一步学习
11.14 下一章
相关阅读:
- 《PHP和MySQL Web开发》学习笔记(十一) (jayson, 2007-7-27)
- 107个常用Javascript语句 (sdaudhy, 2007-8-07)
- 给自己一个目标。。精通PHP。。 (mxonline, 2007-8-09)
- PHP获取文件创建时间和修改时间相关函数 (网鬼, 2007-8-25)
- 《PHP和MySQL Web开发》学习笔记(十二) (jayson, 2007-8-28)
- PHP代码高亮显示函数 (redrangon, 2007-9-03)
- [转]正则表达式中的特殊字符 (redrangon, 2007-9-04)
