第14章 数据库类
PHP功能的强大在于它与数据库的超强结合。数据库,顾名思义,就是数据存放的仓库。在计算机中这个仓库是一个有组织、有纪律的存储系统。一个好的网站离不开一个功能强大的数据库,因此,在学习PHP时,也需要熟悉PHP和数据库的相关操作,本章将要介绍的就是有关PHP和数据库的一些基本知识。
14.1 MySQL数据库
MySQL是一个小巧玲珑的数据库服务器软件,对于小型(当然也不一定很小)应用系统是非常理想的。除了支持标准的ANSI SQL语句,它还支持多种平台,而在UNIX系统上该软件支持多线程运行方式,从而能获得相当好的性能。需要特别说明的是,MySQL数据库与PHP是一对很好的搭档。接下来就来讲解在PHP中如何使用MySQL数据库。
14.1.1 连接到MySQL
所谓数据库就是专为存储数据而设计的库,是相对独立的。所以对于运行在Web服务器上的PHP程序,在使用数据库时,首先需要做的就是连接数据库。PHP本身就提供对MySQL数据库的支持,使用mysql_connect()函数来连接,语法如下:
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )
该函数用来打开或重复使用一个到MySQL服务器的连接。server是需要连接的MySQL服务器,可以包括端口号使用英文的冒号隔开,例如“hostname:port”。username和password分别是连接数据时所需的用户名和密码。new_link参数默认为FALSE,如果用同样的参数第二次调用mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。设置为TRUE时,则总是打开新的连接。
接下来举一个连接本地MySQL数据库的例子,如代码14-1所示。
代码14-1 连接到MySQL数据库
<span class="kindle-cn-bold">连接到MySQL数据库</span><hr /><p> <?php error_reporting(0); //禁止错误输出 $link = mysql_connect('localhost:3306', 'root', ''); //创建数据库连接 if (!$link) { //如果失败 die('连接MySQL服务器失败: ' . mysql_error()); //显示出错信息 } echo '连接MySQL服务器成功!'; //否则显示连接成功的信息 mysql_close($link); //最后关闭数据库连接 ?>
以上代码连接的是一个服务器本地的MySQL数据库,连接用户名为root,密码为空。运行后,得到的结果如图14.1所示。
图14.1 连接成功
注意 MySQL默认是使用3306端口的,如果没有被更改连接时可以省略端口。安装后会自动创建一个root账户,如果没有更改密码,那么它的密码为空。
如果不能创建连接,那么就会输出相应的错误提示。把连接数据库的密码修改掉以后,出现的结果如图14.2所示。
图14.2 连接失败
14.1.2 创建数据库和表
上一个小节中介绍了如何创建一个MySQL的连接,接下来就来讲解如何创建数据库和表。PHP并没有提供直接创建数据库和表的函数,但是它提供的mysql_query()函数可以执行SQL语句。所以只要构造相应的语句,并使用mysql_query()函数来执行它就可以达到创建数据库和表的目的。该函数的使用语法如下:
resource mysql_query ( string query [, resource link_identifier] )
mysql_query()向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定link_identifier,则使用上一个打开的连接。
在创建数据库之前,还需要了解创建数据库的SQL语句。CREATE DATABASE用于创建数据库,并进行命名。如果要使用CREATE DATABASE,需要获得数据库CREATE权限。其使用语法如下:
CREATE DATABASE database_name
在下面的例子中,创建了一个名为“taozi”的数据库,代码如14-2所示。
代码14-2 创建数据库
<span class="kindle-cn-bold">创建数据库</span><hr /><p> <?php error_reporting(0); //禁止错误输出 $con = mysql_connect("127.0.0.1", "root", ""); //建立连接 if (!$con) //如果失败 { die('建立连接失败:' . mysql_error()); //输出出错提示 } if (mysql_query("CREATE DATABASE taozi",$con)) //创建数据库 { echo "创建数据库成功!"; //成功后的提示 } else //如果失败 { echo "创建数据库失败:" . mysql_error(); //出错提示 } mysql_close($con); //关闭数据连接 ?>
以上代码首先使用mysql_connect()函数建立一个数据连接,成功后再使用mysql_query()函数来执行创建数据库的语句。
之后就可以在此数据库的基础上建立数据表,需要用到的创建数据表的语法如下:
CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name3 data_type, ....... )
为了执行创建数据表的命令,必须向mysql_query()函数添加CREATE TABLE语句。下面的例子展示了如何创建一个名为“fruit”的表,此表有三列。列名是“name”,“color”及“price”,如代码14-3所示。
代码14-3 创建数据表
<span class="kindle-cn-bold">创建数据表</span><hr /><p> <?php error_reporting(0); //禁止自动错误输出 $con = mysql_connect("127.0.0.1", "root", ""); //建立连接 if (!$con) //如果失败 { die('建立连接失败:' . mysql_error()); //输出出错提示 } if (mysql_query("CREATE DATABASE taozi",$con)) //创建数据库 { echo "创建数据库成功!"; //成功后的提示 } else //如果失败 { echo "创建数据库失败:" . mysql_error(); //出错提示 } mysql_select_db("taozi", $con); //选择需要使用的数据库 $sql = "CREATE TABLE fruit ( name varchar(15), color varchar(15), price float )"; //创建数据表的SQL语句 mysql_query($sql, $con); //使用mysql_query执行SQL语句 echo "<p>创建数据表成功!"; mysql_close($con); //关闭数据库连接 ?>
以上代码在成功创建数据库以后,首先调用mysql_select_db()函数来选择需要操作的数据库,然后再使用mysql_query()函数执行创建数据表的SQL语句,最后使用mysql_close关闭数据连接。
14.1.3 向表插入数据
在有了数据库和表以后,就可以向其中插入数据。同样,在使用PHP向数据库的表中插入数据时,也需要先建立连接,然后调用mysql_query()函数来执行相应的插入SQL语句。
SQL语法中使用INSERT INTO语句用于向数据库表添加新记录,使用语法如下所示:
INSERT INTO table_name VALUES (value1, value2,....)
还可以规定希望在其中插入数据的列:
INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,....)
Tips SQL语句对大小写不敏感。INSERT INTO与insert into相同。
在前面的小节中,为数据库创建了一个名为“fruit”的表,有三个列:“name”,“color”及“price”。在本例中将使用同样的表。下面的例子向“fruit”表添加了两个新记录,如代码14-4所示。
代码14-4 向表插入数据
<span class="kindle-cn-bold">向表插入数据</span><hr /><p> <?php error_reporting(0); //禁止自动错误输出 $con = mysql_connect("127.0.0.1", "root", ""); //建立连接 if (!$con) //如果失败 { die('建立连接失败:' . mysql_error()); //输出出错提示 } mysql_select_db("taozi", $con); //选择需要使用的数据库 //使用mysql_query执行SQL语句,向数据表中插入数据 mysql_query("INSERT INTO fruit (name, color, price) VALUES ('apple', 'green', '8.5')"); mysql_query("INSERT INTO fruit (name, color, price) VALUES ('orange', 'yellow', '1.35')"); echo "<p>插入数据成功!"; mysql_close($con); //关闭数据库连接 ?>
上述代码,在建立数据连接和选择相应的数据库之后,调用mysql_query()函数来执行插入数据的SQL语句向“fruit”表插入两条水果相关的数据。
但是在实际编程过程中,用得最多的是通过用户对表单的提交来插入数据。下面的例子演示了在使用表单时如何插入数据,如代码14-5所示。
代码14-5 使用表单插入数据
<span class="kindle-cn-bold">表单数据插入</span><hr /> <?php if($_GET['act'] == 'insert') { $con = mysql_connect("127.0.0.1", "root", ""); //建立连接 if (!$con) //如果失败 { die('建立连接失败:' . mysql_error()); //输出出错提示 } mysql_select_db("taozi", $con); //选择需要使用的数据库 //使用mysql_query执行SQL语句,向数据表中插入数据 mysql_query("INSERT INTO fruit (name, color, price) VALUES ('". $_POST['name'] ."', '". $_POST['color'] ."', '". $_POST['prince'] ."')"); echo "<p>插入数据成功!"; mysql_close($con); //关闭数据库连接 die(); //成功后停止输出 } ?> <form action="14-5.php?act=insert" method="post"> <table> <tr> <td>水果名称:</td> <td><input type="text" name="name" /></td> </tr> <tr> <td>水果颜色:</td> <td><input type="text" name="color" /></td> </tr> <tr> <td>水果价格:</td> <td><input type="text" name="prince" /></td> </tr> <tr> <td> </td> <td><input type="submit" value="提交" /></td> </tr> </table> </form>
以上代码,初次运行后会出现一个表单,如图14.3所示。对其输入相应的数据后,单击“提交”按钮提交,会执行if条件判断语句中的代码。在其中完成了数据连接、对数据库的选择,还有使用SQL语句插入提交数据的操作。执行成功以后,得到的效果如图14.4所示,表示数据已经成功插入到数据表中。
图14.3 数据输入表单 | 图14.4 数据插入成功 |
14.1.4 更新表中数据
现在数据表中已经有数据了,但是现在想要把苹果的价格往上调,桔子的价格往下降,该如何操作呢?这时就需要用到更新数据的SQL语句,来更新表中的数据。UPDATE语句用于在数据库表中修改数据,其使用语法如下:
UPDATE table_name SET column_name = new_value WHERE column_name = some_value
注意 SQL对大小写不敏感。UPDATE与update等效。
为了让PHP能执行上面的语句,必须使用mysql_query()函数。该函数用于向SQL连接发送查询和命令。
在本章节中已经创建了一个名为“fruit”的表,并且其中已经插入了一些数据。它看起来的结构和数据如图14.5所示。
图14.5 fruit表结构和数据
下面的例子为更新“fruit”表的一些数据,如代码14-6所示。
代码14-6 更新表中的数据
<span class="kindle-cn-bold">更新表中数据</span><hr /><p> <?php error_reporting(0); //禁止自动错误输出 $con = mysql_connect("127.0.0.1", "root", ""); //建立连接 if (!$con) //如果失败 { die('建立连接失败:' . mysql_error()); //输出出错提示 } mysql_select_db("taozi", $con); //选择需要使用的数据库 //使用mysql_query执行SQL语句,向数据表中插入数据 mysql_query("UPDATE fruit SET price = '19.1' WHERE name = 'apple'"); mysql_query("UPDATE fruit SET price = '2.2' WHERE name = 'orange'"); echo "<p>更新数据成功!"; mysql_close($con); //关闭数据库连接 ?>
在这次更新后,“fruit”表格中的数据如图14.6所示。
图14.6 更新后的数据
14.1.5 查询数据表
最后来介绍一下在PHP中如何查询数据表的内容。这里需要用到SQL的SELECT语句,该语句用于从数据库中选取数据。使用语法如下所示:
SELECT column_name(s) FROM table_name
同样地,为了能让它在PHP上面执行,需要使用mysql_query()函数。该函数用于向MySQL发送查询或命令。下面的例子选取存储在“fruit”表中的所有数据(*字符表示选取表中所有数据)并以表格的方式显示,如代码14-7所示。
代码14-7 查询数据表
<span class="kindle-cn-bold">查询数据表</span><hr /><p> <?php error_reporting(0); //禁止自动错误输出 $con = mysql_connect("127.0.0.1", "root", ""); //建立连接 if (!$con) //如果失败 { die('建立连接失败:' . mysql_error()); //输出出错提示 } mysql_select_db("taozi", $con); //选择需要使用的数据库 $result = mysql_query("SELECT * FROM fruit"); //读取fruit表的数据 echo "<table border='1'><tr><th>水果</th><th>颜色</th><th>价格</th></tr>";//构造表头 while($row = mysql_fetch_array($result)) //循环查询结果集 { echo "<tr>"; echo "<td>" . $row['name'] . "</td>"; //输出水果名 echo "<td>" . $row['color'] . "</td>"; //颜色 echo "<td>" . $row['price'] . "</td>"; //价格 echo "</tr>"; } echo "</table>"; mysql_close($con); //关闭数据库连接 ?>
查询数据表的步骤与其他对数据表操作的步骤基本是相同的。特别的是,在读取数据以后对数据的循环输出,在示例中是使用mysql_fetch_array()函数来读取结果集中的数据并以数组的方式返回数据。运行代码后得到的结果如图14.7所示。
图14.7 查询数据表
14.2 MSSQL数据库使用实例
虽然MySQL数据库与PHP是天生的一对搭档,但是有时出于项目要求或者特殊原因需要其他的数据库作为项目的数据源,这个时候该怎么办呢?不用担心,PHP已经为大家想到了这点,并提供许多种主流数据库的解决方案。
本节来做一个使用PHP来操作MsSQL数据库的例子。因为MsSQL到现在的版本已经有很多,这里是以MSSQL2000为例子,其附带有一个“Northwind”数据库,如图14.8所示。下面打开其中的“Categories”表,大致会显示如图14.9所示的数据。
图14.8 “Northwind”数据库中的表 | 图14.9 “Categories”表中的数据 |
由上图可得知,这个数据表中含有“CategoryID”、“CategoryName”、“Description”及“Picture”字段。其中特殊的是“Description”字段,存储的是二进制形式的图片。
Tips 不能用DB-Library(如ISQL)或ODBC 3.7或更早版本将ntext数据或仅使用Unicode 排序规则的Unicode数据发送到客户端。相对于这个注意事项,在查询数据集的时候可以将ntext数据转为text数据。
查询MSSQL数据表如代码14-8所示,运行代码后得到的结果如图14-10所示。
代码14-8 查询MSSQL数据表
<span class="kindle-cn-bold">查询MSSQL数据表</span><hr /><p> <?php $msconnect=mssql_connect("localhost", "sa", ""); //创建ms数据库连接 $msdb=mssql_select_db("Northwind", $msconnect); //选择数据库 $msquery = "SELECT CategoryID, convert(varchar(255), CategoryName) as CategoryName, convert(text, Description) as Description, Picture FROM Categories"; //创建查询的SQL语句 $msresults= mssql_query($msquery); //使用SQL语句查询 echo '<ul>'; while ($row = mssql_fetch_array($msresults)) { //循环遍历记录 echo "<li>ID:" . $row['CategoryID'] . "<br> 名称:" . $row['CategoryName'] . "<br> 说明:" . $row['Description'] . "</li>"; } echo '</ul>'; ?>
图14.10 查询MSSQL数据表结果
14.3 典型实例
【实例14-1】由于PHP存储数据库的功能一直未标准化,所以在访问不同的数据库时,需要不能的访问函数。而ADODB的出现解决了这个问题。ADODB是由PHP编写的数据库操作类,其支持的数据库包括MySQL、PostgreSQL、Interbase、Informix、Oracle、MS SQL 7、Foxpro、Access、ADO、Sybase、DB2、ODBC等。
ADODB最大的特点是,访问不同的数据库时,使用的访问接口都是一样的。这使得开发人员不需要学习多种数据库的连接方法,就可以轻松地使用ADODB操作各种不同的数据库。由于ADODB使用统一的接口访问各种数据库,这也使得数据库之间的转换变得很简单。
本实例演示如何安装和使用ADODB。
要在开发项目中使用ADODB,需要操作以下3个步骤。
(1)下载:要取得ADODB的安装包,可以从网站(https://sourceforge.net/projects/adodb/files/latest/download)上下载。
(2)安装:解压缩下载后的安装包,把解压后的adodb5文件夹复制到项目文件夹下。
(3)使用:在PHP代码中引用adodb5文件夹中的adodb.inc.php文件即可。如果要想实现更多的类,可以参考以下文件的功能,并根据实际情况,选择要包含的文件。
- adodb.inc.php:ADODB的主文件,在要使用的页面中,必须包含这些文件。
- adodb-errorhandler.inc.php:用于管理自订错误信息。
- adodb-session.php:用于操作Session。
- adodb-pager.inc.php:用于实现分页管理。
- adodb-pear.inc.php:加入此文件后,可以使用PHP4的PEAR DB语法来使用ADODB。例如:$dsn="mysql://root@localhost/learn"。
- rsfilter.inc.php:用于过滤记录。
- tohtml.inc.php:用于把取出的数据库记录,转换成表格。
- toexport.inc.php:用于输出CSV格式的文件。
- pivottable.inc.php:可以在脚本中使用pivot table功能。
代码14-9 安装与使用ADODB
<?php //包含adodb文件 include_once("adodb5/adodb.inc.php"); //设置链接MySQL数据的变量 $host = "localhost"; //数据库服务器地址 $user = "root"; //用户名 $pass = ""; //密码 $db = "mysql"; //要操作的数据库 //建立链接对象,并设置连接数据库的类型 $conn = &ADONewConnection('mysql'); // 连接数据库 // 例如:$conn->Connect('主机','使用者','密码','数据库'); // 持续性连接,可使用PConnect()方法 // 例如:$conn->PConnect('主机','使用者','密码','数据库'); $conn->Connect($host,$user,$pass,$db); // 要不要显示调试信息量,false代表不要,true代表要 // 例如:$conn->debug = false; //设置为显示调试信息 $conn->debug = true; //设置字符集 $conn->Execute("SET NAMES gb2312"); //设置SQL语句 $sql = "select * from help_topic limit 0,15"; //执行SQL语句,并将返回的数据保存到变量$result中 $result = $conn->Execute($sql); //检查返回的结果集,若返回FALSE,显示错误信息 if($result == FALSE){ echo "<pre>".$conn->ErrorMsg()."</pre>"; }else{ //使用FetchRow()方法,把返回结果以数组形式赋予$row $table = "<table border='1'><tr><th>ID</th><th>名称</th><th>分类ID</th><th>链接</th></tr>"; while($row = $result->FetchRow()){ //使用FetchRow()方法,以数组形式,返回当前行内容 //在表格中使用 $table .= "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td><td>".$row[5]."</td></tr>"; } $table .= "</table>"; echo $table; } //关闭链接 $conn->close(); ?>
运行该程序后运行结果如图14.11所示。
图14.11 程序运行结果
【实例14-2】ADODB有很多特性,不仅可以使用同一接口访问不同数据库,而且也提供了很多有用的函数,供开发人员使用。本实例将演示使用ADODB实现数据分页的相关操作。
要使用ADODB的分页功能,需要在引用“adodb.in.php”文件的同时,也需要引用“adodb-pager.inc.php”文件。
用于处理数据分页的类是ADODB_Pager,其函数Render()用于显示分页信息。具体使用方法如下代码所示。
代码14-10 处理数据分页
<?php include_once('adodb5/adodb.inc.php'); //包含ADODB文件 include_once('adodb5/adodb-pager.inc.php'); //包含分页功能文件 session_start(); //启动Session,传递数据 //设置链接MySQL数据的变量 $host = "localhost"; //数据库服务器地址 $user = "root"; //用户名 $pass = "password"; //密码 $db = "mysql";//要操作的数据库 $conn = &ADONewConnection('mysql'); //建立链接对象 $conn->Connect($host,$user,$pass,$db); //连接数据库 $conn->Execute("SET NAMES gb2312"); //设置字符集 //选择要分页的表 $sql = "select help_topic_id,name,help_category_id,url from help_topic"; $pager = new ADODB_Pager($conn,$sql); //创建$pager对象 //初始化分页设置 $pager->first = "第一页"; $pager->prev = "上一页"; $pager->next = "下一页"; $pager->last = "最后一页"; $pager->gridAttributes='border="1" cellpadding="3" cellspacing="0"'; $pager->Render($rows_per_page=10); //设置每页显示3条记录 ?>
运行该程序后,运行结果如图14.12所示。
图14.12 程序运行结果
14.4 小结
本章主要介绍如何使用PHP来操作MySQL数据库。主要有连接数据库、创建数据库、创建数据表、查询数据表、插入数据及删除数据等。此后还介绍了如果使用PHP来建立与MSSQL数据的连接,以及如何对其进行相关的操作。
通过本章的学习,读者对基本数据库的应用会有更深一步的了解。
14.5 习题
一、填空题
1. PHP连接一个MySQL服务器,可以调用函数_____,还可以调用函数_____,实现永久连接。
2. 程序获得一个服务器的连接后,调用_____函数选择要访问的数据库。
3. 创建一个名为数据库student,并将结果赋予变量$resul,_____。
4. MySQL库提供的两个错误检查函数是_____和_____,每个函数都返回一个与MySQL操作相关联的错误信息。
5. 查询数据库个数的函数是_____,能用来查询数据库表个数的函数是_____。
6. $dbase_name = mysql_tablename($database,$i),变量$dbase_name存储的是_____。
7. __________语句是用新值更新现存表中的行和列。
8. __________语句可以从数据表提取的结果数据集合中得到指定记录号的记录。
二、选择题
1、在PHP中创建MySQL连接时一般要测试连接是否成功,常用的错误处理指令是( )。
A. dead
B. die
C. exception
D. process
2. 分析表头时使用( )函数时,必须将结果传入到其他变量中。
A. mysql_fetch_field()
B. mysql_fetch_row()
C. mysql_fetch_column()
D. mysql_fetch_row()
3. 增加记录可以使用( )语句。
A. delete
B. create
C. select
D. insert into
4. 每个mysql_fetch_array()或mysql_fetch_row()语句,得到一条数据表记录的第一个字段的值放入到指定数组第( )单元中。
A. 0
B. 1
C. 2
D. 3
三、简答题
1. 试说出查看数据库和数据表名的方法。
2. 简述数据查询的方法。
四、编程题
1. 通过PHP脚本连接到自己的MySQL数据库,建立一个address数据库。将公司的员工姓名、性别、电话、E-mail、家庭住址等信息存入数据库中。
2. 制作一个具有搜索功能的页面,查询address数据库里的信息。
共有条评论 网友评论