一、MySQL数据库简介
MySQL 被广泛地应用在 互联网 上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多公司都采用 MySQL 数据库以降低成本。
MySQL 数据库可以称得上是目前运行速度最快的 SQL 语言数据库之一。除了具有许多其他数据库所不具备的功能外,MySQL 数据库还是一种完全免费的产品,用户可以直接通过网络下载 MySQL 数据库,而不必支付任何费用。
1、MySQL 特点
- 功能强大:MySQL 中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能,可以处理每天访问量超过数亿的高强度的搜索 Web 站点。MySQL5 支持事务、视图、存储过程、触发器等。
- 支持跨平台:MySQL 支持至少 20 种以上的开发平台,包括 Linux、Windows、FreeBSD 、IBMAIX、AIX、FreeBSD 等。这使得在任何平台下编写的程序都可以进行移植,而不需要对程序做任何的修改。
- 运行速度快:高速是 MySQL 的显著特性。在 MySQL 中,使用了极快的 B 树磁盘表(MyISAM)和索引压缩;通过使用优化的单扫描多连接,能够极快地实现连接;SQL 函数使用高度优化的类库实现,运行速度极快。
- 支持面向对象:PHP 支持混合编程方式。编程方式可分为纯粹面向对象、纯粹面向过程、面句对象与面向过程混合 3 种方式。
- 安全性高:灵活和安全的权限与密码系统,允许基本主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码的安全。
- 成本低:MySQL 数据库是一种完全免费的产品,用户可以直接通过网络下载。
- 支持各种开发语言:MySQL 为各种流行的程序设计语言提供支持,为它们提供了很多的 API 函数,包括 PHP、ASP.NET、Java、Eiffel、Python、Ruby、Tcl、C、C++、Perl 语言等。
- 数据库存储容量大:MySQL 数据库的最大有效表尺寸通常是由操作系统对文件大小的限制决定的,而不是由 MySQL 内部限制决定的。InnoDB 存储引擎将 InnoDB 表保存在一个表空间内,该表空间可由数个文件创建,表空间的最大容量为 64TB,可以轻松处理拥有上千万条记录的大型数据库。
- 支持强大的内置函数:PHP 中提供了大量内置函数,几乎涵盖了 Web 应用开发中的所有功能。它内置了数据库连接、文件上传等功能,MySQL 支持大量的扩展库,如 MySQLi 等,可以为快速开发 Web 应用提供便利。
2、数据库在 Web 开发中的重要地位
归根结底,动态网站都是对数据进行操作,我们平时浏览网页时,会发现网页的内容会经常变化,而页面的主体结构框架没变,新闻就是一个典型。这是因为我们将新闻存储在了数据库中,用户在浏览时,程序就会根据用户所请求的新闻编号,将对应的新闻从数据库中读取出来,然后再以特定的格式响应给用户。
Web 系统的开发基本上是离不开数据库的,因为任何东西都要存放在数据库中。所谓的动态网站就是基于数据库开发的系统,最重要的就是数据管理,或者说我们在开发时都是在围绕数据库在写程序。所以作为一个 Web 程序员,只有先掌握一门数据库,才可能去进行软件开发。
下图展示了项目中一个模块的开发流程:将网站的内容存储在 MySQL 数据库中;然后使用 PHP 通过 SQL 查询获取这些内容并以 HTML 格式输出到浏览器中显示。或者将用户在表单中输出的数据,通过在 PHP 程序中执行 SQL 查询,将数据保存在 MySQL 数据库中。也可以在 PHP 脚本中接受用户在网页上的其他相关操作,再通过 SQL 查询对数据库中存储的网站内容进行管理。
PHP 几乎可以使用现有的所有的数据库,MySQL 与其他的大型数据库例如 Oracle、DB2、SQL Server 等相比,自有它的不足之处,比如规模小、功能有限(MySQL Cluster 的功能和效率都相对比较差)等,但这也丝毫没有减少它受欢迎的程度。 对于一般的个人使用者或者中小型企业来说,MySQL 提供的功能已经绰绰有余,而且由于 MySQL 是开放源码软件,因此可以大大降低总体拥有成本。
目前 Internet 上流行的网站构架方式分别是 LAMP(Linux + Apache + MySQL + PHP/Perl/Python)和 LNMP(Linux + Nginx + MySQL + PHP/Perl/Python),也就是使用 Linux 作为操作系统,Apache 和 Nginx 作为 Web 服务器,MySQL 作为数据库,PHP 作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件,因此使用这种方式不用花一分钱(除开人工成本外)就可以建立起一个稳定、免费的网站系统。
3、PHP 和 MySQL 的合作方式
在同一个 MySQL 数据库服务器中可以创建多个数据库,如果把每个数据库看成是一个“仓库”,那么网站中的内容数据就存储在这个仓库中。而对数据库中数据的存取及维护等,都是通过数据库管理系统软件进行管理的。
同一个数据库管理系统可以为不同的网站分别建立数据库,但为了使网站中的数据便于维护、备份及移植,最好为一个网站创建一个数据库(在大数据量时则采用分库分表)。数据库和数据库管理系统,以及 PHP 应用程序之间的关系如下图所示。
二、PHP访问MySQL数据库
使用 PHP 操作 MySQL 数据库是进行 Web 开发的必然要求之一,PHP 中提供了完整的操作 MySQL 数据库的函数,这些函数包括了从连接数据库、执行 SQL 语句、处理数据结果集到关闭数据库的方方面面。通过这些函数,使基于 MySQL 数据库的 Web 开发高效而简单。通常 PHP 访问 MySQL 数据库的步骤如下图所示。
PHP中提供了很多操作MySQL数据库的函数,利用这些函数,可以完成对MySQL数据库的各种操作。PHP 5.0之后的版本,PHP推荐使用mysqli系列函数来操作MySQL数据库,本教材主要介绍mysqli系列函数。1、PHP设置
在此之前,我们需要确保开启了 PHP 中的 mysqli 扩展。以 Windows 系统为例,开启 mysqli 扩展就是将 php.ini 配置文件中extension=mysqli一项的注释去掉即可。 开启成功后可以使用 phpinfo() 函数查看,示例代码如下:
<?php
phpinfo();
?>
出现如下界面则表示开启成功
2、连接 MySQL 数据库
在操作MySQL数据库之前,首先要确保已成功连接MySQL数据库。连接MySQL数据库服务器常用的函数是mysqli_connect()。
函数的语法格式如下:
mysqli_connect(string host,string username,string password,string database);
函数功能:通过PHP程序连接MySQL数据库服务器。
如果连接MySQL数据库服务器成功,函数返回值为一个MySQL服务器连接标识(Link_identifier),否则返回值为FALSE。
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$link = mysqli_connect($host,$username,$password); // 连接到数据库
if(!$link) die( '数据库连接失败!');
?>
3、设置数据库字符集
我们在执行PHP程序显示数据库的内容时,有时会发现在浏览器页面上本来应该显示的中文字符却变成了一堆乱码,这是因为MySQL数据库、PHP程序、HTML页面以及浏览器所使用的字符集不一致造成的。MySQL数据库默认使用的字符集是utf-8 如 上面例子中使用的
<?php
// mysqli_set_charset($link,'UTF-8');
?>
4、选择数据库
通过前面的介绍我们知道,对应数据库名称的参数是可以省略的,如果省略该参数的话,就需要我们在后面来指定一个默认的数据库。同时,需要在多个数据库之间切换时,也可以使用。
PHP 中可以使用 mysqli_select_db() 函数来指定一个默认数据库,它和 MySQL 命令中的use dbname的功能相似,函数的语法格式如下:
面向对象风格的写法:
mysqli::select_db(string $dbname)
其中,$dbname 为指定的数据库名称
面向过程风格的写法:
mysqli_select_db(mysqli $link, string $dbname)
其中,$link 为通过 mysqli_connect() 函数返回的数据库连接,$dbname 为指定的数据库名称。
函数执行成功会返回 TRUE,执行失败则返回 FALSE。
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$link = mysqli_connect($host, $username, $password);
//创建数据库
// mysqli_query($link, "CREATE database school");
// $dbname = 'school';
//选择数据库
// mysqli_select_db($link, $dbname);
//直接使用数据库
// $link = mysqli_connect($host, $username, $password, $dbname);
if(!$link) die('数据库连接失败!');
?>
5、执行SQL语句
成功选择好 MySQL 数据库后,接下来就可以对所选数据库中的数据表进行查询、更改以及删除等操作,PHP 中我们使用 mysqli_query() 函数就可以实现上述的所有操作,函数的语法格式如下:
mysqli_query($connection, $query[, $resultmode])
- $connection 表示由 mysqli_connect() 函数返回的数据库连接;
- $query:要执行的 SQL 语句;
- $resultmode:可选参数,用来修改函数的行为。可以是下列值的任意一个:
- MYSQLI_USE_RESULT(如果需要查询大量数据,使用这个);
- MYSQLI_STORE_RESULT(默认值)。
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'school';
$link = mysqli_connect($host,$username,$password,$dbname); // 连接到数据库
if(!$link) die( '数据库连接失败!');
mysqli_set_charset($link,'UTF-8'); // 设置数据库字符集
//创建表
mysqli_query($link, "
CREATE TABLE if NOT EXISTS `student`(
`id` INT UNSIGNED AUTO_INCREMENT,
`xh` VARCHAR(255) NOT NULL,
`xm` VARCHAR(255) NOT NULL,
`bj` VARCHAR(255) NOT NULL,
`cj` INT NOT NULL,
PRIMARY KEY(`id`)
);
");
?>
提示:函数执行失败时会返回 FALSE;而通过 mysqli_query() 成功执行 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询时则会返回一个 mysqli_result 对象;其他查询执行成功则返回 TRUE。
① 发送insert、update或delete语句
使用mysqli_query()函数向MySQL服务器发送insert、update或delete命令语句后,可以使用mysqli_affected_rows()函数查看SQL语句影响的表记录行数。
函数的语法格式如下:
mysqli_affected_rows(connection) - 取得函数最近一次与表操作所影响的记录行数。
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'school';
$link = mysqli_connect($host, $username, $password, $dbname);
if($link){
$sql="
insert into
student(xh,xm,bj,cj)
values
('010301', '赵方叶', '计算机应用3班', 70),
('010302', '钱方叶', '计算机应用3班', 90),
('010303', '孙方叶', '计算机应用3班', 80),
('010304', '李方叶', '计算机应用3班', 60),
('010305', '周方叶', '计算机应用3班', 50),
('010306', '吴方叶', '计算机应用3班', 77),
('010307', '郑方叶', '计算机应用3班', 88),
('010308', '王方叶', '计算机应用3班', 91),
('010309', '冯方叶', '计算机应用3班', 92),
('010310', '陈方叶', '计算机应用3班', 86),
('010311', '楚方叶', '计算机应用3班', 77),
('010312', '卫方叶', '计算机应用3班', 88)
";
$result=mysqli_query($link,$sql);
if($result){
echo "插入记录的行数:".mysqli_affected_rows($link);
} else {
echo"数据插入失败!";
}
mysqli_close($link);
}else{
echo '数据库连接失败!';
}
?>
② 发送select语句
使用mysqli_query()函数向MySQL服务器发送select命令语句后,mysqli_query()函数将得到一个结果集(result)数据,此时可以使用mysqli_num_rows()函数查看该结果集的记录行数。
函数的语法格式如下:
int mysqli_num_rows(result)- result:由 mysqli_query()返回的结果集标识符
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'school';
$link = mysqli_connect($host, $username, $password, $dbname);
if($link){
$sql = 'select xh,xm,bj,cj from student'; // SQL 语句
$result = mysqli_query($link, $sql); // 执行 SQL 语句,并返回结果
$row_count=mysqli_num_rows($result);
$data = mysqli_fetch_all($result); // 从结果集中获取所有数据
mysqli_close($link);
}else{
echo '数据库连接失败!';
}
echo "记录数:".$row_count;
echo '<pre>';
print_r($data);
?>
6、遍历结果集
在使用mysqli_query()函数取得查询的结果集后,就可以遍历结果集中的数据。
- 在 PHP 中处理数据结果集的函数主要有以下几个:
- mysqli_fetch_row():从结果集中取得一行,并以索引数组的形式返回;
- mysqli_fetch_assoc():从结果集中取得一行,并以关联数组的形式返回;
- mysqli_fetch_array():从结果集中取得一行,并以关联数组、索引数组或二者兼有的形式返回;
- mysqli_fetch_all():从结果集中取得所有行,并以关联数组、索引数组或二者兼有的形式返回;
- mysqli_fetch_object():从结果集中取得一行,并以对象的形式返回。
① mysqli_fetch_row()函数
函数的语法格式如下:
array mysqli_fetch_row(result); - 从结果集result中获取一行记录,并将该行记录生成一个数组,数组元素的键从0开始,数组元素的值依次为select语句中“字段列表”的值。若结果集result中没有记录,则函数的返回值为FALSE。
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'school';
$link = mysqli_connect($host, $username, $password, $dbname);
if($link){
$sql = 'select xh,xm,bj,cj from student'; // SQL 语句
$result = mysqli_query($link, $sql); // 执行 SQL 语句,并返回结果
while($s=mysqli_fetch_row($result)){
echo $s[0]. " "; //显示字段xh的值
echo $s[1]. " "; //显示字段xm的值
echo $s[2]. " "; //显示字段bj的值
echo $s[3]. " "; //显示字段cj的值
echo "<br/>"; //输出换行符
}
mysqli_close($link);
}else{
echo '数据库连接失败!';
}
?>
② mysqli_fetch_array()函数
函数的语法格式如下:
array mysqli_fetch_array(result, result type); - 该函数是mysqli_fetch_row()的扩张版本,函数的返回值除了包含mysqli_fetch_row()函数的返回值外,还包含select语句中“字段列表=>字段列表值”的数组元素。
- result 由 mysqli_query()返回的结果集标识符
- result type 可选。规定产生数组的类型,可以是以下值中的一个。
- MYSQLI_ASSOC:数组索引形式;
- MYSQLI_NUM:数字索引数组形式;
- MYSQLI_BOTH:以上二者都可以
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'school';
$link = mysqli_connect($host, $username, $password, $dbname);
if($link){
$sql="select * from student";
$result=mysqli_query($link, $sql);
while($s=mysqli_fetch_array($result)){
echo $s['xh']. " "; //显示字段xh的值
echo $s['xm']. " "; //显示字段xm的值
echo $s['bj']. " "; //显示字段bj的值
echo $s['cj']. " "; //显示字段cj的值
echo "<br/>";
}
mysqli_close($link);
}else{
echo '数据库连接失败!';
}
?>
③mysqli_fetch_object()函数
函数的语法格式如下:
array mysqli_fetch_object(result, classname,params); - 该函数从结果集中取得一行数据,并作为对象返回。若结果集result中没有记录,则函数的返回值为FALSE。
- result 由 mysqli_query()返回的结果集标识符
- classname 可选。规定要实例化的类名称,设置属性并返回
- params 可选。规定一个传给 classname 对象构造器的参数数组
<?php
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'school';
$link = mysqli_connect($host, $username, $password, $dbname);
if($link){
$sql="select * from student";
$result=mysqli_query($link, $sql);
while($s=mysqli_fetch_object($result)){
echo $s->xh. " "; //显示字段xh的值
echo $s->xm. " "; //显示字段xm的值
echo $s->bj. " "; //显示字段bj的值
echo $s->cj. " "; //显示字段cj的值
echo "<br/>";
}
mysqli_close($link);
}else{
echo '数据库连接失败!';
}
?>
7、关闭与MySQL数据库的连接
操作MySQL数据库完毕,最好立即关闭与MySQL服务器的连接。常用的函数有mysqli_free_result()和mysqli_close()。
① mysqli_free_result()函数
语法格式如下:
mysqli_free_result(result); - 释放结果集所占用的内存,该函数无返回值
- result 由 mysqli_query()返回的结果集标识符
② mysqli_close()函数
语法格式如下:
mysqli_close(connection); - 关闭与MySQL服务器的连接,如果关闭成功返回 TRUE,否则将返回 FALSE
- connection 要关闭的 MySQL 连接
三、综合实例
1、分页显示
<html>
<head>
<title>分页显示</title>
</head>
<body>
<?php
$con = mysqli_connect("localhost", "root", "123456", "test");
$sql = "select * from student";
$result = mysqli_query($con, $sql);
$count = mysqli_num_rows($result); //记录总条数$count。
$pagesize = 5; //每页要显示的记录条数$pagesize
if ($count % $pagesize == 0) $pagecount = $count / $pagesize;
else $pagecount = (int)($count / $pagesize + 1); //总页数$pagecount
$row = mysqli_fetch_array($result); //数组$row的键名为字段名
$page = @$_GET["page"]; //欲显示的页数$page
if ($page == null) $currentpage = 1;
else $currentpage = intval($page);
for ($i = 1; $i <= ($currentpage - 1) * $pagesize; $i++) //指定每一页面显示5条记录
{
if (!$row) break;
$row = mysqli_fetch_array($result);
}
?>
<table width="800" border="1" align="center" cellpadding="0">
<tr>
<td height="25" colspan="2" align="center" bgcolor="#99CCCC">第<?php echo $currentpage; ?>页/共<?php echo $pagecount; ?>页</font>
<?php
if ($currentpage == 1) echo "首 页 | 上一页 | ";
else {
?>
<a href="index.php?page=1">首 页</a> |
<a href="index.php?page=<?php echo $currentpage - 1; ?>">上一页</a> |
<?php
}
if ($currentpage == $pagecount) echo "下一页 | 尾 页";
else {
?>
<a href="index.php?page=<?php echo $currentpage + 1; ?>">下一页</a> |
<a href="index.php?page=<?php echo $pagecount; ?>">尾 页</a>
<?php
}
?>
</td>
</tr>
<tr>
<td width="400" height="25" align="center">学号</td>
<td width="400" height="25" align="center">姓名</td>
</tr>
<?php
for ($i = 1; $i <= $pagesize; $i++) {
if (!$row) break;
?>
<tr>
<td width="400" height="25" align="center"><?php echo $row[0]; ?></td>
<td width="400" height="25" align="center"><?php echo $row[1]; ?></td>
</tr>
<?php
$row = mysqli_fetch_array($result);
}
?>
</table>
</body>
</html>
2、另一种分页
<html>
<head>
<title>分页显示</title>
</head>
<body>
<?php
$con = mysqli_connect("localhost", "root", "123456", "test");
$sql = "select * from student";
$result = mysqli_query($con, $sql);
$count = mysqli_num_rows($result); //记录总条数$count。
$pagesize = 5; //每页要显示的记录条数$pagesize
if ($count % $pagesize == 0) $pagecount = $count / $pagesize;
else $pagecount = (int)($count / $pagesize + 1); //总页数$pagecount
$page = @$_GET["page"]; //欲显示的页数$page
if ($page == null) $currentpage = 1;
else $currentpage = intval($page);
?>
<table width="800" border="1" align="center" cellpadding="0">
<tr>
<td height="25" colspan="2" align="center" bgcolor="#99CCCC">第<?php echo $currentpage; ?>页/共<?php echo $pagecount; ?>页</font>
<?php
if ($currentpage == 1) echo "首 页 | 上一页 | ";
else {
?>
<a href="index.php?page=1">首 页</a> |
<a href="index.php?page=<?php echo $currentpage - 1; ?>">上一页</a> |
<?php
}
if ($currentpage == $pagecount) echo "下一页 | 尾 页";
else {
?>
<a href="index.php?page=<?php echo $currentpage + 1; ?>">下一页</a> |
<a href="index.php?page=<?php echo $pagecount; ?>">尾 页</a>
<?php
}
?>
</td>
</tr>
<tr>
<td width="400" height="25" align="center">学号</td>
<td width="400" height="25" align="center">姓名</td>
</tr>
<?php
$currNo = ($currentpage - 1)* $pagesize;
$sql = "select * from student limit $currNo, $pagesize";
$result = mysqli_query($con, $sql);
$row = mysqli_fetch_all($result);
for ($i = 0; $i < $pagesize; $i++) {
?>
<tr>
<td width="400" height="25" align="center"><?php echo $row[$i][0]; ?></td>
<td width="400" height="25" align="center"><?php echo $row[$i][1]; ?></td>
</tr>
<?php
}
?>
</table>
</body>
</html>