ext-align: justify; text-indent: 2em; margin-top: 0px; margin-bottom: 0px; -ms-text-justify: inter-ideograph;">函数DB::isError会检查返回的结果是不是个错误。如果是,可以使用DB::errorMessae得到错误对应的文字描述。你需要将函数的返回值传递给DB::errorMessage作为参数。
下面使用PEAR代码重写错误检查:
<?php
if ( DB::isError( $demoResult = $db->query( $sql)))
{
echo DB::errorMessage($demoResult);
} else
{
while ($demoRow = $demoResult->fetchRow( ))
{
echo $demoRow[2] . '<br />';
}
}
?>
PEAR数据库接口还提供了一个新版本叫做PEAR::MDB2。例9-6给出了使用MDB2版本重写同一个例子的代码。
例9-8:使用PEAR::MDB2显示表books
<?php
include('db_login.php');
require_once('MDB2.php');
//Translate our database login information into an array.
$dsn = array(
'phptype' => 'mysql',
'username' => $username,
'password' => $password,
'hostspec' => $host,
'database' => $database
);
//Create the connection as an MDB2 instance.
$mdb2 = MDB2::factory($dsn);
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage( ));
}
//Set the fetchmode to field associative.
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
$query = "SELECT * FROM books NATURAL JOIN authors";
$result =$mdb2->query($query);
if (PEAR::isError($result)){
die("Could not query the database:<br />$query ".$result->getMessage( ));
}
//Display the results.
echo('<table border="1">');
echo '<tr><th>Title</th><th>Author</th><th>Pages</th></tr>';
//Loop through the result set.
while ($row = $result->fetchRow( )) {
echo "<tr><td>";
echo htmlentities($row['title']) . '</td><td>';
echo htmlentities($row['author ']) . '</td><td>';
echo htmlentities($row['pages']) . '</td></tr>';
}
echo("</table>");
//Close the connection.
$result->free( );
?>
我们得到同样的显示结果。这个版本的PEAR数据库抽象提供了更多的函数。
现在我们掌握了连接数据库的方法以及PEAR提供的各种函数。
, 通过PHP访问MySQL
译文:
现在你已经可以熟练地使用MySQL客户端软件来操作数据库里的数据,我们也可以开始学习如何使用PHP来显示和修改数据库里的数据了。PHP有标准的函数用来操作数据库。
我们首先学习PHP内建的数据库函数,然后会学习PHP扩展和应用程序库(PEAR,PHP Extension and Application Repository )中的数据库函数,我们可以使用这些函数操作所有支持的数据库。这种灵活性源自于抽象。对于编程接口而言,抽象简化了复杂的交互过程。它将交互过程中无关紧要的部分屏蔽起来,让你关注于重要的部分。PEAR的DB类就是这样一种数据库接口的抽象。你登录一个数据库所需要提供的信息被减少到最少。这种标准的格式可以通过同一个函数来访问MySQL以及其他的数据库。同样,一些MySQL特定的函数被更一般的、可以用在很多数据库上的函数所替代。比如,MySQL特定的连接函数是:
mysql_connect($db_host, $db_username, $db_password);
而PEAR的DB提供的连接函数是:
$connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");
两个命令都提供了同样的基本信息,但是PEAR的函数中还指定了要连接的数据库的类型。你可以连接到MySQL或者其他支持的数据库。我们会详细讨论这两种连接方式。
本章中,我们会学习如何从PHP连接到MySQL的服务器,如何使用PHP访问数据库中存储的数据,以及如何正确的向用户显示信息。
步骤
无论是通过MySQL命令行工具,还是通过PHP,执行一个查询的基本步骤都是一样的:
• 连接到数据库
• 选择要使用的数据库
• 创建SELECT语句
• 执行查询
• 显示结果
我们将逐一介绍如何用PHP和PEAR的函数完成上面的每一步。
资源
当连接到MySQL数据库的时候,你会使用到两个新的资源。第一个是连接的标识符,它记录了一个活动连接用来连接到数据库所必需的所有信息。另外一个资源是结果资源,它包含了用来从一个有效的数据库查询结果中取出结果所需要的所有信息。本章中我们会创建并使用这两种资源。
使用PHP函数查询数据库
本节我们会介绍如何使用PHP连接MySQL数据库。这非常简单,我们会用一些例子说明。但是之前我们应该稍微了解一下幕后发生的事情。当你试图连接一个MySQL数据库的时候,MySQL服务器会根据你的用户名和密码进行身份认证。PHP为你建立数据库的连接,你可以立即开始查询并得到结果。
我们需要同样的信息来连接数据库:
• 数据库服务器的IP地址
• 数据库的名字
• 用户名
• 密码
在开始之前,首先使用MySQL的命令行客户端确认你登录到数据库。
图9-1显示了数据库交互过程的各个步骤和两种类型资源之间的关系。创建SELECT语句发生在第三个函数调用之前,但是在图中没有显示出来。它是通过普通的PHP代码,而不是MySQL特定的PHP函数完成的。
图9-1:使用数据库时函数和资源之间的交互
包含数据库登录细节
我们先创建一个文件,用来保存登录MySQL所用到的信息。我们建议你把这些信息放在单独的文件里然后通过include来使用这个文件。这样一来如果你修改了数据库的密码。无论有多少个PHP文件访问数据库,你只需要修改这一个文件。
注意:不用担心有人会直接看到这个文件从而得到你的数据库的登录信息。如何被直接请求,这个文件会被当作PHP文件处理,返回结果是一个空白页。
|
假设这个文件的名字叫做db_login.php,并且它跟其他所用PHP文件放在同一个目录下。这个文件的内容如例9-1所示。
例9-1:设置数据库登录的配置文件模板
<?php
$db_host='hostname of database server';
$db_database='database name';
$db_username='username';
$db_password='password';
?>
在例9-2中,我们创建的文件使用跟Web服务器放在同一台机器上的数据库,并指定的数据库的名字,用户名和密码。
例9-2:db_login.php文件示例
<?php
$db_host='localhost';
$db_database='test';
$db_username='test';
$db_password='yourpass';
?>
图9-2显示了如何在其他PHP文件中使用这个文件。我们会继续使用在第七章中创建的数据库。
图9-2:在多文件中重复使用登录信息
例9-3是精简后的,用mysqldump命令得到的重建这个数据库的SQL命令。
例9-3:重建测试数据库的SQL语句
DROP TABLE IF EXISTS books;
CREATE TABLE books (
title_id int(11) NOT NULL auto_increment,
title varchar(150) default NULL,
pages int(11) default NULL,
PRIMARY KEY (title_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Dumping data for table books
--
INSERT INTO books VALUES (1,'Linux in a Nutshell',476),(2,'Classic Shell Scripting',256);
--
-- Table structure for table purchases
--
DROP TABLE IF EXISTS purchases;
CREATE TABLE purchases (
id int(11) NOT NULL auto_increment,
user varchar(10) default NULL,
title varchar(150) default NULL,
day date default NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Dumping data for table purchases
--
LOCK TABLES purchases WRITE;
INSERT INTO purchases VALUES (1,'Mdavis','Regular Expression Pocket Reference','2005-02-15'),(2,'Mdavis','JavaScript & DHTML Cookbook','2005-02-10');
如果你在第8章中没有创建这些表,可以将例9-3中的代码保存成文件backup.sql,然后在命令行执行命令,命令格式如下:
mysql -u username -ppassword -D database_name < backup_file_name.sql
如果使用例子中的值,那么这个命令就是:
mysql -u test -pyourpass -D test < backup.sql
数据库的名字叫test,它包含三个表,分别是books、authors和purchases。每个表都有一些示例记录。这些就足以让我们开始使用PHP来进行查询了。
连接到数据库
我们需要做的头一件事情是连接数据库,并且检查连接是否确实建立起来。如例9-4所示,通过include包含连接信息的文件,我们可以在调用mysql_connect函数的时候使用这些变量而不是将这些值写死在代码中。我们使用一个叫做db_test.php的文件,往其中增加这些代码段。
例9-4:在db_test.php中包含连接参数和调用mysql_connect
// Include our login information
include('db_login.php');
// Connect
$connection = mysql_connect($db_host, $db_username, $db_password);
if (!$connection){
die ("Could not connect to the database: <br />". mysql_error( ));
}
函数mysql_connect的参数是数据库服务器主机、用户名和密码。如果连接成功,就会返回新建立的连接,如果不能建立连接就会返回FALSE。检查这个函数的返回值来确保连接的确建立起来了。如果遇到问题,比如不正确的密码,可以使用mysql_error打印一条友好的警告信息以及导致错误的原因。
注意:不仅仅是打印一条错误信息,die()还会停止这个程序的执行。对于大部分数据库驱动网页来说,不能访问数据库就意味着网页毫无用处。通过使用die来终止程序的执行,可以避免用户看到大量的错误信息。
|
请注意我们还没有指定数据库的名字。
诊断连接错误
你可能遇到的一个错误是:
Fatal error: Call to undefined function mysql_connect( ) in C:\Program Files\Apache
Software Foundation\Apache2.2\htdocs\db_test.php on line 4
这个错误发生的原因是下载安装的PHP5.x默认没有包括对MySQL的支持。解决这个问题需要将php_mysql.dll文件从PHP压缩包例的ext/目录复制到C:/php,并修改C:\WINDOWS\php.ini文件,确保下面两行没有被注释掉(注释的方法在行首使用分号)。
extension_dir = "c:/PHP/ext/"
extension=php_mysql.dll
这样PHP扩展的目录就被设为C:\PHP,MySQL的扩展也会被使用。在编辑php.ini文件的时候,你可以使用编辑器的搜索功能来检查这两行是否已经存在,只是需要去掉注释,并且需要重新输入。
重新启动Apache,这样MySQL的支持就会被打开了。
选择数据库
建立连接之后,下一步就是使用mysql_select_db来选择我们要用的数据库。它的参数有两个:数据库名和可选的数据库连接。如果不指定数据库连接,默认使用上一条mysql_connect所建立的连接。
// Select the database
$db_select=mysql_select_db($db_database);
if (!$db_select)
{
die ("Could not select the database: <br />". mysql_error( ));
}
同样的,每次访问数据库的时候最好能检查可能的错误并且进行显示。
注意:虽然可以在同一个脚本里多次调用mysql_select_db,但这不是一个好习惯。
|
现在我们做好了一切准备工作,可以开始执行SQL查询了。
构建SQL SELECT查询
构建SQL查询非常容易就是将一个字符串赋值给变量。这个字符串就是我们的SQL查询,当然我们要给出有效的SQL查询,否则执行这个查询的时候MySQL会返回错误。我们使用$query作为变量名,这个名字对应其目的,你也可以选择任何你喜欢的变量名。这个例子中的SQL查询是”SELECT * FROM books”。
注意:跟使用mysql命令行客户端不同,这里的查询不需要以分号结尾。
|
你可以使用字符串连接操作符(.)来构建查询:
// Assign the query
$select = ' SELECT ';
$column = ' * ';
$from = ' FROM ';
$tables = ' books ';
$where = ' NATURAL JOIN authors';
$query = $select.$column.$from.$tables.$where;
这个版本的代码比下面的代码要灵活多了:
// Assign the query
$query = "SELECT * FROM books NATURAL JOIN authors";
查询字符串也可以在WHERE子句中使用变量来限定返回什么样的行,这些变量可能是用户信息,也可能是来自其他的查询。
现在我们已经将查询赋值给了一个变量,下一步就是执行它。
执行查询
使用mysql_query函数来告诉数据库执行查询。它有两个参数:查询和可选的数据库连接,返回值是查询结果。我们将查询结果保存在一个变量里,也许你已经猜到我们要用变量名就是$result。这里同样有必要检查mysql_query的返回值不是FALSE来确保查询字符串和数据库连接都没有问题。
// Execute the query
$result = mysql_query( $query );
if (!$result){
die ("Could not query the database: <br />". mysql_error( ));
}
当数据库查询的时候,所有的结果构成一个结果集。这些结果跟使用mysql命令行客户端执行同样查询所得到的行一致。要显示这些结果,你需要依次处理这些行。
取结果并显示
使用mysql_fetch_row从结果集中取出一行,它的用法如下:
array mysql_fetch_row ( resource $result);
它的参数是SQL查询返回的结果,我们将结果保存在$result中。每次调用它返回一行数据,直到没有数据为止,这时候它返回FALSE。这样,我们可以使用一个循环,在循环内调用mysql_fetch_row并使用一些代码来显示每一行。
// Fetch and display the results
while ($result_row = mysql_fetch_row(($result))){
echo 'Title: '.$result_row[1] . '<br />';
echo 'Author: '.$result_row[4] . '<br /> ';
echo 'Pages: '.$result_row[2] . '<br /><br />';
}
结果行的所有列都保存在一个数组里,可以方便地进行访问。变量$result_row[2]访问结果行的第二个属性(数组的顺序是查询是定义的列的顺序,如果使用SELECE * ,那么数组顺序就是表的列的顺序)。
取结果的方式
去结果的方式不止一种。使用mysql_fetch_arrry可以一次性将所有结果放在一个数组里。它的参数是查询结果和一个可选的结果绑定方式。如果绑定方式指定为MYSQL_ASSOC,数组中的结果则使用查询中列的名字进行访问。如果指定了MYSQL_NUM,那么就使用从0开始的数字来访问结果。默认使用的方式是MYSQL_BOTH,这样返回的数组支持两种类型的访问。Mysql_fetch_assoc是使用MYSQL_ASSOC取结果的另外一种方式。
用mysql_fetch_array加上MYSQL_ASSOC的方式重写上面的代码,如下所示:
// Fetch and display the results
while ($result_row = mysql_fetch_array($result, MYSQL_ASSOC)){
echo 'Title: '.$result_row['title'] . '<br />';
echo 'Author: '.$result_row['author'] . '<br /> ';
echo 'Pages: '.$result_row['pages'] . '<br /><br />';
}
关闭连接
绝大部分情况下,我们在使用完一个数据库之后要关闭到它的连接。使用mysql_close来关闭一个数据库,它会告诉PHP和MySQL这个数据库连接已经不再使用,所使用的所有资源和内存都可以释放。
mysql_close($connection)
使用PEAR
PEAR是一个框架和可重用PHP组建的发布系统,它为PHP开发提供了一套增强的功能,PEAR包括很多种模块,用来处理从会话管理到购物车功能的几乎所有事情。表9-1列出了现有的模块种类。
表9-1:PEAR模块种类
Authentication HTML Processing
Benchmarking HTTP Science
Caching Images Semantic Web
Configuration Internationalization Streams
Console Logging Structures
Database Mail System
Date/Time Math Test
Encryption Networking Tools and utilities
Event Numbers Validate
File formats Payment Web services
File system PEAR XML
GTK components PHP
我们的列表还不够完整,可以访问http://pear.php.net来获得供下载的所有模块。
安装
PEAR使用包管理器来管理安装PEAR模块。是否需要安装包管理取决于你所使用的PHP版本。如果你使用的版本是PHP4.4.0或者更新的版本,那么就已经安装了包管理器。如果你使用的是PHP5.0,则PEAR是一个单独的包。我们要用到的DB包是可选的,但是它会被包管理器默认安装。所以,如果你有包管理器,那么就全搞定了。
UNIX
在UNIX系统下,可以通过在shell(命令行)下执行下面的命令来安装包管理器:lynx -source http://go-pear.org/ | php
这个命令使用go-pear.org的输出(实际就是PHP源代码)来安装PEAR,go-pear.org的输出被传给php命令执行。
Windows
安装完PHP5后,会有一个PEAR安装脚本C:\php\go-pear.bat。如果你在第二章没有安装所以文件,那么现在把所有的PHP文件都解压到C:\php下,然后执行这个批处理文件。
注意:如果你是通过MSI安装程序安装PHP,需要执行下面的命令而不是使用go-pear.bat文件:php go-pear.phar如果PEAR目录不存在,那就需要重新执行PHP的MSI安装程序,选择Change选项,然后将“Extensions and Extras”设置成“Will be installed on local drive”。完毕后再执行go-pear.phar。
|
图9-5显示执行PEAR安装程序后的初始屏幕。
图9-5:go-pear.bat安装脚本
安装程序会要求输入几个路径,你可以使用默认值。那样安装的最上级目录就是c:\php.
注意:php.exe必须位于系统路径中。在命令行输入php.exe来确认。如果没有找到这个命令,那需要将它的路径加到PATH变量中。要修改系统的PATH变量,选择“开始—控制面板—系统—环境变量”,在PATH变量的后面增加一项“C:\php”。
|
PEAR安装程序会创建文件C:\php\PEAR_ENV.reg,双击该文件在注册表中设置PEAR的路径。这个文件的内容视安装的PEAR版本而定。当弹出对话框要求确认的时候,点击OK将信息加入注册表。
在执行完这个批处理文件后,你可能需要编辑php.ini文件,将PEAR的目录加入到include_path中。Php.ini的447行看起来如下:
include_path = ".;c:\php\includes;c:\php\PEAR"
Apache必须重启才能使用DB包。
托管ISP
大部分人的ISP都安装了PEAR DB。如果你的ISP没有提供,可以要求他们安装。你可以通过执行例9-8中的代码来判断PEAR DB是否已经安装,如果没有,那么在执行这个脚本的时候“require_once(‘DB.php’)”这一行就会报错。
增加额外的包
完成上面的步骤之后,你可以通过在命令行输入“pear”来运行PEAR的包管理器。增加新的模块非常容易,只需要执行“pear packagename”就可以了。你不需要安装DB模块,因为在安装包管理器的时候它已经默认安装了。
不过如果你运行的是Windows XP Home ,需要执行下面的步骤来安装PEAR DB:
C:\>cd c:\php
C:\>pear install DB
C:\>pear list
找出安装PEAR包的版本,执行pear list。这个命令返回一个列表,如图9-6所示:
图9-6:安装的PEAR包和版本列表
一旦安装完PEAR,我们就可以开始使用它了。
用PEAR重写Books例子
使用PEAR DB包的时候,执行的步骤和使用PHP函数是类似。不过,函数的用法有细微的不同。我们会逐行解释两者的差别,如例9-7所示。
例9-7:用PEAR DB 显示books表
1 <?php
2
3 include('db_login.php');
4 require_once('DB.php');
5
6 $connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");
7
8 if (DB::isError($connection)){
9 die("Could not connect to the database: <br />".DB::errorMessage($connection));
10 }
11
12 $query = "SELECT * FROM books NATURAL JOIN authors";
13 $result = $connection->query($query);
14
15 if (DB::isError($result)){
16 die("Could not query the database:<br />$query ".DB::errorMessage($result));
17 }
18
19 echo('<table border="1">');
20 echo '<tr><th>Title</th><th>Author</th><th>Pages</th></tr>';
21
22 while ($result_row = $result->fetchRow( )) {
23 echo "<tr><td>";
24 echo $result_row[1] . '</td><td>';
25 echo $result_row[4] . '</td><td>';
26 echo $result_row[2] . '</td></tr>';
27 }
28
29 echo("</table>");
30 $connection->disconnect( );
31
32 ?>
例9-7显示的效果如图9-7所示。
图9-7:使用PEAR DB的函数不影响输出
注意图9-7跟图9-4完全一致。
第3行没有变化,包括数据库登录信息:
include('db_login.php');
第4行增加了一个新的require语句:
require_once( "DB.php" );
这行语句包含DB.php,这个文件提供了PEAR DB函数。如果没有找到DB.php文件,函数require_once会终止代码并返回错误。同时也可以避免同一个文件被包含两次,一个文件被多次包含也会导致问题。
注意:DB.php文件可以在PHP发布的pear子目录下找到。安装PEAR的时候应该已经将这个路径添加到pph.ini文件中的include_path了。如果找不到,应该检查PEAR DB是否正确安装,以及路径是否正确设置。
|
创建连接示例
DB.php文件定义了类DB。参考第5章有关使用类和对象的更多信息。我们将会主要使用这个类提供的方法。类DB有一个connect方法,我们会使用它来替换前面使用的connect函数mysql_connect。双冒号(::)表示调用类的函数,如第6行所示。
$connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");
当调用connect函数的时候,它出创建一个新的数据库连接,保存在变量$connection中。Connect函数试图通过传递给它的连接字符串来连接数据库。
连接字符串
连接字符串使用新的格式来表示登录信息,这些信息我们已经通过单独的域提供:
dbtype://username:password@host/database
这个格式看起来也许会有些熟悉,它跟Windows的文件共享所使用的连接字符串非常相似。字符串的第一部分phptype是将PEAR函数与一般PHP函数区分开来的关键部分。Phptype域指定要连接的数据库类型,支持的数据库包括ibase、mysql、mssql、mysql、oci8、odbc、pgsql、和sybase。如果需要使用不同类型的数据库,你的PHP代码只需要修改phptype.
其他的域username、password、host和database跟基本的PHP connect类似。只有连接类型是必需的,不过通常要指定所有的域。
代入了db_login.php中的数值之后,连接字符串如下所示:
"mysql://test:test@localhost/test"
如果第6行的连接方法调用成功,就会创建一个DB对象。它包含访问数据库的方法和数据库连接的所有状态信息。
查询
DB对象包含的一个方法是query。Query方法跟PHP的query函数非常类似,都接受一个SQL语句作为参数。区别是要使用箭头(->)来通过对象调用函数,并且它返回的结果是另外一个对象而不是结果集。
$query = "SELECT * FROM books"
$result = $connection->query($query);
这个代码在连接对象上调用query函数,执行SQL查询,返回结果对象$result.
取结果
第22行在结果对象上调用方法fetchRow。与mysql_fetch_row类似,这个方法一次返回一行数据:
while ($result_row = $result->fetchRow( )) {
echo 'Title: '.$result_row[1] . '<br />';
echo 'Author: '.$result_row[4] . '<br /> ';
echo 'Pages: '.$result_row[2] . '<br /><br />';
}
使用一个while循环并调用fetchRow来遍历所有行,直到fetchRow返回FALSE。
循环内的代码跟未使用PEAR的例子中的代码一致。
关闭
第30行结束数据库连接,它使用的是DB对象的disconnect方法:
$connection->disconnect( );
PEAR错误报告
全套毕业设计论文现成成品资料请咨询