数据库的名字叫test,它包含三个表,分别是books、authors和purchases。
每个表都有一些示例记录。
这些就足以让我们开始使用PHP来进行查询了。
连接到数据库
我们需要做的头一件事情是连接数据库,并且检查连接是否确实建立起来。
如例9-4所示,通过include包含连接信息的文件,我们可以在调用mysql_connect函数的时候使用这些变量而不是将这些值写死在代码中。
我们使用一个叫做db_test.php的文件,往其中增加这些代码段。
例9-4:
在db_test.php中包含连接参数和调用mysql_connect
//Includeourlogininformation
include('db_login.php');
//Connect
$connection=mysql_connect($db_host,$db_username,$db_password);
if(!
$connection){
die("Couldnotconnecttothedatabase:
".mysql_error());
}
函数mysql_connect的参数是数据库服务器主机、用户名和密码。
如果连接成功,就会返回新建立的连接,如果不能建立连接就会返回FALSE。
检查这个函数的返回值来确保连接的确建立起来了。
如果遇到问题,比如不正确的密码,可以使用mysql_error打印一条友好的警告信息以及导致错误的原因。
注意:
不仅仅是打印一条错误信息,die()还会停止这个程序的执行。
对于大部分数据库驱动网页来说,不能访问数据库就意味着网页毫无用处。
通过使用die来终止程序的执行,可以避免用户看到大量的错误信息。
请注意我们还没有指定数据库的名字。
诊断连接错误
你可能遇到的一个错误是:
Fatalerror:
Calltoundefinedfunctionmysql_connect()inC:
\ProgramFiles\Apache
SoftwareFoundation\Apache2.2\htdocs\db_test.phponline4
这个错误发生的原因是下载安装的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所建立的连接。
//Selectthedatabase
$db_select=mysql_select_db($db_database);
if(!
$db_select)
{
die("Couldnotselectthedatabase:
".mysql_error());
}
同样的,每次访问数据库的时候最好能检查可能的错误并且进行显示。
注意:
虽然可以在同一个脚本里多次调用mysql_select_db,但这不是一个好习惯。
现在我们做好了一切准备工作,可以开始执行SQL查询了。
构建SQLSELECT查询
构建SQL查询非常容易就是将一个字符串赋值给变量。
这个字符串就是我们的SQL查询,当然我们要给出有效的SQL查询,否则执行这个查询的时候MySQL会返回错误。
我们使用$query作为变量名,这个名字对应其目的,你也可以选择任何你喜欢的变量名。
这个例子中的SQL查询是”SELECT*FROMbooks”。
注意:
跟使用mysql命令行客户端不同,这里的查询不需要以分号结尾。
你可以使用字符串连接操作符(.)来构建查询:
//Assignthequery
$select='SELECT';
$column='*';
$from='FROM';
$tables='books';
$where='NATURALJOINauthors';
$query=$select.$column.$from.$tables.$where;
这个版本的代码比下面的代码要灵活多了:
//Assignthequery
$query="SELECT*FROMbooksNATURALJOINauthors";
查询字符串也可以在WHERE子句中使用变量来限定返回什么样的行,这些变量可能是用户信息,也可能是来自其他的查询。
现在我们已经将查询赋值给了一个变量,下一步就是执行它。
执行查询
使用mysql_query函数来告诉数据库执行查询。
它有两个参数:
查询和可选的数据库连接,返回值是查询结果。
我们将查询结果保存在一个变量里,也许你已经猜到我们要用变量名就是$result。
这里同样有必要检查mysql_query的返回值不是FALSE来确保查询字符串和数据库连接都没有问题。
//Executethequery
$result=mysql_query($query);
if(!
$result){
die("Couldnotquerythedatabase:
".mysql_error());
}
当数据库查询的时候,所有的结果构成一个结果集。
这些结果跟使用mysql命令行客户端执行同样查询所得到的行一致。
要显示这些结果,你需要依次处理这些行。
取结果并显示
使用mysql_fetch_row从结果集中取出一行,它的用法如下:
arraymysql_fetch_row(resource$result);
它的参数是SQL查询返回的结果,我们将结果保存在$result中。
每次调用它返回一行数据,直到没有数据为止,这时候它返回FALSE。
这样,我们可以使用一个循环,在循环内调用mysql_fetch_row并使用一些代码来显示每一行。
//Fetchanddisplaytheresults
while($result_row=mysql_fetch_row(($result))){
echo'Title:
'.$result_row[1].'
';
echo'Author:
'.$result_row[4].'
';
echo'Pages:
'.$result_row[2].'
';
}
结果行的所有列都保存在一个数组里,可以方便地进行访问。
变量$result_row[2]访问结果行的第二个属性(数组的顺序是查询是定义的列的顺序,如果使用SELECE*,那么数组顺序就是表的列的顺序)。
取结果的方式
去结果的方式不止一种。
使用mysql_fetch_arrry可以一次性将所有结果放在一个数组里。
它的参数是查询结果和一个可选的结果绑定方式。
如果绑定方式指定为MYSQL_ASSOC,数组中的结果则使用查询中列的名字进行访问。
如果指定了MYSQL_NUM,那么就使用从0开始的数字来访问结果。
默认使用的方式是MYSQL_BOTH,这样返回的数组支持两种类型的访问。
Mysql_fetch_assoc是使用MYSQL_ASSOC取结果的另外一种方式。
用mysql_fetch_array加上MYSQL_ASSOC的方式重写上面的代码,如下所示:
//Fetchanddisplaytheresults
while($result_row=mysql_fetch_array($result,MYSQL_ASSOC)){
echo'Title:
'.$result_row['title'].'
';
echo'Author:
'.$result_row['author'].'
';
echo'Pages:
'.$result_row['pages'].'
';
}
关闭连接
绝大部分情况下,我们在使用完一个数据库之后要关闭到它的连接。
使用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 SemanticWeb
Configuration Internationalization Streams
Console Logging Structures
Database Mail System
Date/Time Math Test
Encryption Networking Toolsandutilities
Event Numbers Validate
Fileformats Payment Webservices
Filesystem PEAR XML
GTKcomponents PHP
我们的列表还不够完整,可以访问来获得供下载的所有模块。
安装
PEAR使用包管理器来管理安装PEAR模块。
是否需要安装包管理取决于你所使用的PHP版本。
如果你使用的版本是PHP4.4.0或者更新的版本,那么就已经安装了包管理器。
如果你使用的是PHP5.0,则PEAR是一个单独的包。
我们要用到的DB包是可选的,但是它会被包管理器默认安装。
所以,如果你有包管理器,那么就全搞定了。
UNIX
在UNIX系统下,可以通过在shell(命令行)下执行下面的命令来安装包管理器:
lynx-sourcehttp:
//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文件:
phpgo-pear.phar如果PEAR目录不存在,那就需要重新执行PHP的MSI安装程序,选择Change选项,然后将“ExtensionsandExtras”设置成“Willbeinstalledonlocaldrive”。
完毕后再执行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都安装了PEARDB。
如果你的ISP没有提供,可以要求他们安装。
你可以通过执行例9-8中的代码来判断PEARDB是否已经安装,如果没有,那么在执行这个脚本的时候“require_once(‘DB.php’)”这一行就会报错。
增加额外的包
完成上面的步骤之后,你可以通过在命令行输入“pear”来运行PEAR的包管理器。
增加新的模块非常容易,只需要执行“pearpackagename”就可以了。
你不需要安装DB模块,因为在安装包管理器的时候它已经默认安装了。
不过如果你运行的是WindowsXPHome,需要执行下面的步骤来安装PEARDB:
C:
\>cdc:
\php
C:
\>pearinstallDB
C:
\>pearlist
找出安装PEAR包的版本,执行pearlist。
这个命令返回一个列表,如图9-6所示:
图9-6:
安装的PEAR包和版本列表
一旦安装完PEAR,我们就可以开始使用它了。
用PEAR重写Books例子
使用PEARDB包的时候,执行的步骤和使用PHP函数是类似。
不过,函数的用法有细微的不同。
我们会逐行解释两者的差别,如例9-7所示。
例9-7:
用PEARDB显示books表
1
php
2
3include('db_login.php');
4require_once('DB.php');
5
6$connection=DB:
:
connect("mysql:
//$db_username:
$db_password@$db_host/$db_database");
7
8if(DB:
:
isError($connection)){
9die("Couldnotconnecttothedatabase:
".DB:
:
errorMessage($connection));
10}
11
12$query="SELECT*FROMbooksNATURALJOINauthors";
13$result=$connection->query($query);
14
15if(DB:
:
isError($result)){
16die("Couldnotquerythedatabase:
$query".DB:
:
errorMessage($result));
17}
18
19echo('');
20e