MySQL数据库的应用编程

MySQL数据库的应用编程

MySQL作为一类中小型关系数据库管理系统,目前一杯广泛应用于互联网中各种中小型完整或信息管理系统的开发,其所搭建的应用环境主要有LAMP和WAMP两者,它们均可使用PHP作为于MySQL数据库进行交互的服务器端脚本语言。本文主要介绍使用PHP进行MySQL数据库应用编程的相关知识。

PHP概述

PHP是Hypertext Preprocessor(超文本预处理器)的递归缩写,目前使用相当广泛,它是一种在服务器端执行的HTML文档的脚本语言,语言风格类似于C语言,其独特的语法混合了C、Java、Perl以及PHP自创的新语法。PHP作为一种服务器端的脚本/编程语言,凭借其简单、面向对象、解释型、高性能、独立于框架、动态、可移植等特点,成为了当前世界上最流行的构建B/S模式Web应用程序的编程语言之一。
PHP具有强大的功能,其能实现所有的GGI的功能,并可提供比一般的GGI更快的执行速度,它的多平台特性使其能无缝地运行在Unix和Windows平台。另外,更为突出的是它对数据库强大的操作能力以及操作的简便性,使其可以方便快捷地操作几乎所有留下的数据库,其中PHP搭配MySQL成为目前Web应用开发的最佳组合。

PHP编程的基础

例如,编写一个可以通过浏览器网页显示“hello world”的PHP5程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<title>Hello world!</title>
</head>
<body>
<h1>
<?php
$string = "Hello!";
echo $string;
?>
</h1>
</body>
</html>

由PHP代码生成的的网页代码为:

1
2
3
4
5
6
7
8
9
10

<html>
<head>
<title>Hello world!</title>
</head>
<body>
<h1>
Hello!</h1>
</body>
</html>

由此可见,PHP程序是在Web服务器端运行的,且最终会以HTML文档的格式输出到客户端/浏览器。从语法上来看,PHP语言是借鉴C语言的语法特征,由C语言改进而来的。在PHP应用程序编写的过程中,可以混合编写PHP和HTML,即不仅仅可以将PHP5代码脚本通过标签<? php?>嵌入到Html中,还可以把HTML标签嵌入到PHP5的脚本里。

使用PHP进行MySQL数据库应用编程

针对不同的应用,PHP内置了很多函数。为了在PHP5程序中实现对MySQL数据库的各种操作,可以使用其中的mysql函数库。然而,在使用mysql函数库访问MySQL数据库之前,需要在PHP的配置文件php.ini中将“; extension=php_mysql.dll”中的“; ”删除。然后重启Web服务器。

通过内置的函数库mysql,PHP5程序能够很好地与MySQL数据库进行交互。使用这种方式所构建的基于B/S模式的Web应用程序的工作流程可以描述如下:

  1. 在用户计算机的浏览器中通过在地址栏中输入相应的URI信息,向网页服务器提出交互请求。
  2. 网页服务器收到用户浏览器端的交互请求。
  3. 网页服务器根据请求寻找服务器上的网页。
  4. Web应用服务器执行页面内含的PHP代码脚本程序。
  5. PHP代码脚本程序通过内置的MySQL API函数访问后台MySQL数据库服务器。
  6. PHP代码脚本程序取回后台MySQL数据库服务器的查询结果。
  7. 网页服务器将查询结果以HTML文档的格式返回给用户浏览器。

编程步骤

使用PHP进行MySQ数据库编程的基本步骤如下:

  1. 首先建立与MySQL数据库编程的基本步骤;
  2. 然后选择要对其进行操作的数据库;
  3. 再执行相应的数据库操作,包括对数据的添加、删除、修改和查询等。
  4. 最后关闭与MySQL数据库服务器的连接。

以上各步骤,均是通过PHP 5内置函数库mysql中相应的函数来实现的。

建立与MySQL数据库服务器的连接

在PHP5中,可以使用函数mysql_connect()和函数mysql_pconnect()来建立与MySQL数据库服务器的连接。其中函数mysql_connect()用于建立非持久连接,而mysql_pconnect()用于建立持久连接。

使用函数mysqli_connect()建立连接

在PHP5中,函数mysql_connect()函数的语法格式为(这个函数在PHP7中已被废弃!):

1
mysql_connect([servername[, username[, password]]])

语法说明如下:

  • servername:可选项,为字符串型,用于指定要连接的数据库服务器。默认值为“localhost:3306”;
  • username:可选项,字符串型,用于指定登录服务器所使用的用户名。默认值为拥有服务器进程的用户的名称,如超级用户root;
  • password:可选项,字符串型,用于指定登录数据库服务器所用的密码,默认为空串;
  • 函数mysql_connect()的返回值为资源句柄型(resource)。若成功执行,则返回一个连接标识号;否则返回false。

在PHP程序中,通常将该函数返回的连接标识号存储在某个变量中,以备PHP程序使用。实际上,在后续其他有关操作MySQL数据库的函数中,一般都需要指定相应的连接标识号作为该函数的实参。

例如,编写一个数据库服务器的连接示例程序connect.php,连接MySQL数据库并使用变量$con保存连接的结果。

1
2
3
4
5
6
7
8
9
10
<?php
$con = mysqli_connect("localhost", "root", "12345");
if(!$con) {
echo "连接失败!<br>";
echo "错误编号:".mysqli_errno()."<br>";
echo "错误信息:".mysqli_error()."<br>";
}
else{
echo "连接成功";
}

注意:在PHP7中,mysql_connect已被废弃,所以需要使用mysqli_connect。上面的代码运行环境为PHP7.2+MySQL8.0。直接运行会出现错误,解决办法参考php7连接mysql8

在PHP中,一切非0值会被认为是true,而数值0则被当作逻辑值false。mysqli_connect()函数执行成功后,实际上返回的标识号是一个非0值,即被当作逻辑值true来处理。因而判断是否成功连接,只需要判断返回值即可。

如果连接失败,则可进一步调用PHP中的函数mysqli_errno()mysqli_error(),以获取相应的错误编号和错误提示信息。
当一个MySQL函数成功执行后,函数mysqli_errno()mysqli_error()分别会返回数值0和空字符串,因此,这两个函数也可以用于判断函数mysqli_connect()或者其他MySQL函数的执行情况。

补充部分:PHP连接MySQL

PHP5及以上版本建议使用以下方式连接MySQL:

  • MySQLi extension (“i”意为improved)
  • PDO(PHP Data Objects)

在PHP早期版本中使用MySQL扩展,但是该扩展在2012年开始不建议使用。

该用MySQLi还是PDO?

  • “习惯哪个就用哪个!”
  • MySQLi和PDO各有优势:
  • PDO应用在12种不同数据库中,而MySQLi只针对MySQL数据库;
  • 所以如果你的项目需要在多种数据库中切换,建议使用PDO,这样你只需要修改连接字符串和部分查询语句即可。使用MySQLi,如果不同数据库,你需要重新编写所有的代码,包括查询。
  • 两者都是面向对象,但是MySQL还提供了API接口。
  • 两者都支持预处理语句,预处理语句可以防止SQL注入,对于web项目的安全性非常重要的。

面向对象的MySQL数据库连接

1
2
3
4
5
6
7
8
9
10
<?php
$servername = "localhost";
$username = "root";
$password = "12345";
$conn = new mysqli($servername, $username, $password)
if ($conn -> connect_error){
die("连接失败:".$conn -> connect_error);
}
echo "连接成功!";
?>

面向过程的MySQL数据库连接

1
2
3
4
5
6
7
8
9
10
<?php
$servername = "localhost";
$username = "root";
$password = "12345";
$conn = mysqli_connect($servername, $username, $password);
if (!$conn) {
die("连接失败:".mysqli_connect_error());
}
echo "连接成功!";
?>

PDO连接MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
<?
$servername = "localhost";
$username = "root";
$password = "12345";
try{
$conn = new PDO("mysql:host = $servername;", $username, $password);
echo "连接成功!";
}
catch(PDOException $e)
{
echo $e -> getMessage();
}
?>

关闭连接

面向对象的MySQLi

1
$conn -> close();

面向过程的MySQLi

1
mysqli_close($conn);

PDO

1
$conn = null;

选择数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/**
* 选择数据库
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/6
* Time: 21:41
*/
$con = mysqli_connect("localhost:3306", "root", "12345");
if(mysqli_errno()){
echo "<font color='red'>数据库服务器连接失败!</font><br>";
die();
}
mysqli_select_db($con, "db_school");
if(mysqli_errno()){
echo "<font color='red'>数据库选择失败</font><br>";
die();
}
else{
echo "<font color='green'>数据库选择成功!</font><br>";
}
?>

执行数据库操作

数据的添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/**
* 执行数据库操作
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/6
* Time: 20:40
*/
$con = mysqli_connect("localhost:3306", "root", "12345")
or die("数据库连接失败!<br>");
mysqli_select_db($con,"db_school") or die("<font color='#ff070f'>数据库选择失败!</font><br>");
mysqli_query($con, "set names 'utf8'");
$sql = "insert into db_school.tb_student(studentNo, studentName, sex, birthday, native, nation, classNo)
values
('2013122102', '张五勇', '男', '1997-12-11','山西', '汉', 'AC1301')";
if (mysqli_query($con, $sql)){
echo "<br><font color='#04ff06'>学生插入成功!</font>";
}
else{
echo "<br><font color='#ff070f'>学生添加失败!</font>";
}
?>

数据的修改

为了方便我把连接数据库部分的代码单独拿出来存为con.php文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/**
* 连接mysql数据库
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/6
* Time: 22:22
*/
$host = "localhost:3306";
$user = "root";
$password = "12345";
$con = mysqli_connect($host, $user, $password);
?>

然后就可以在其他的程序中调用它了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
/**
* 数据的修改
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/6
* Time: 22:21
*/
require "con.php";
mysqli_select_db($con, "db_school") or die("数据库选择失败!<br>");
mysqli_query($con, "set names 'utf8'");
$sql = "update db_school.tb_student set native = '广州'";
$sql = $sql."where studentName = '张晓勇'";
if(mysqli_query($con, $sql)){
echo "🎉修改成功!";
}
else{
echo "修改失败!";
}
?>

数据的删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
/**
* 删除
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/6
* Time: 23:08
*/
require "con.php";
mysqli_select_db($con, "db_school");
mysqli_query($con, "set names utf8");
$sql = "delete from tb_student";
$sql = $sql." where studentName = '张五勇'";
if (mysqli_query($con, $sql))
echo "🎉🎉🎉学生删除成功!";
else
echo "学生删除失败!";
?>

数据的查询

在PHP程序中,可以将MySQL中用于数据检索的select语句置于函数mysqli_query()中,实现在选定的数据库中查询所要的数据。此时mysqli_query()被成功执行时返回的值不再是一个逻辑值true,而是一个资源句柄型的结果标识符。结果标识符也被称为结果集,代表了相应查询语句的查询结果。每个结果集中都有一个记录指针,所指向的记录即为当前记录。
在初始状态下,结果集的当前记录就是第一条记录。为了灵活地处理结果集中的相关记录,PHP提供了一系列的处理函数,包括结果集中记录的读取、指针的定位以及记录集的释放等。

读取结果集中的记录

在PHP5中,可以使用下列函数来读取结果集中的函数:

1
2
3
mysql_fetch_array(data[, array_type])
mysql_fetch_row(data)
mysql_fetch_assoc(data)

语法说明如下:

  • data:为资源句柄型,用于指定要使用的数据指针。该数据指针可以指向函数mysql_query()产生的结果集,即结果标志符。
  • array_type:可选项,为整型,用于指定函数返回值的形式,其有效取值为PHP常量MYSQL_NUM(表示数字数组)、MYSQL_ASSOC(表示关联数组)或MYSQL_BOTH(表示同时产生关联数组和数字数组)。其默认值为MYSQL_BOTH。
  • 三个函数被成功执行后,其返回值均为数组类型。若成功,即读取到当前记录,则返回一个由结果集当前记录所生成的数据,其中每个字段的值会保存在相应的索引之中,并自动将记录指针指向下一个记录。若失败,即没有读取到记录,则返回FALSE。
    在使用函数mysql_fetch_array()时,若以常量MYSQL_NUM作为第二个参数,其功能与函数mysql_fetch_row()的功能是一样的,所返回的数据均为数字索引方式的数组,只能以相应的序号(从0开始)作为元素的下标进行访问;若以常量MYSQL_ASSOC作为第二个参数,则其功能与mysql_fetch_assoc的功能一样,所返回的数组作为关联索引方式的数组,只能以相应的字段名(如果指定了别名,则为相应的别名)作为元素的下标进行访问;若未指定第二个参数,或以MYSQL_BOTH作为第二个参数,则返回的数组以数字索引方式与关联索引方式的数组,既能以序号为元素的下标进行访问,又能以字段名作为元素的下标进行访问。由此可见,mysql_fetch_array()完全包含了mysql_fetch_row()和mysql_fetch_assco()的功能。因此在实际使用中更加常用。

例如,编写一个检索数据的PHP示例程序select.php,要求在数据库中查询学号为”2013110101”的学生的姓名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
/**
* 在数据库中查询学号为"2013110101"的学生的姓名
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/7
* Time: 11:43
*/
require "con.php";
mysqli_select_db($con, "db_school") or die("数据库选择失败!<br>");
mysqli_query($con, "set names utf8");
$sql = "select studentName from tb_student";
$sdl = $sql." where studentNo = '2013110101'";
$result = mysqli_query($con, $sql);
if ($result){
echo "<font color='green'>🎉🎉学生查询成功!</font><br>";
$array = mysqli_fetch_array($result, MYSQLI_NUM);
if($array){
echo "读到学生信息!<br>";
echo "所要查询学生的姓名是:".$array[0];
}
else echo "没有找到该学生!<br>";
}
else echo "<font color='red'>🙅🙅学生查询失败!</font><br>";
?>

读取结果集中的记录数

在PHP5中,可以使用mysql_num_rows()来读取结果集中的记录数,即数据集的行数。其语法格式为:

1
mysql_num_rows(data)

例如,查询女学生的人数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
/**
* 查询女学生的人数:
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/7
* Time: 12:43
*/
require "con.php";
mysqli_select_db($con, "db_school");
mysqli_query($con, "set names utf8");
$sql = "select * from tb_student";
$sql = $sql." where sex = '女'";
$result = mysqli_query($con, $sql);
if($result){
echo "<font color='green'>🎉🎉查询成功!</font><br>";
$num = mysqli_num_rows($result);
echo "数据库db_school中的女学生数为:".$num."位";
}
else echo "<font color='red'>🙅🙅查询失败!</font>";

读取指定记录号的记录

在PHP5中,可以使用mysql_data_seek()在结果集中随意移动记录的指针,也就是将记录指针直接指向某个记录。其语法格式为:

1
mysql_data_seek(data, row)

该函数的返回值为布尔型。
例如,编写一个读取指定结果集中记录号的PHP程序,要求查询第三位女生的姓名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
* 查询第三位女生的姓名
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/7
* Time: 12:52
*/
require "con.php";
mysqli_select_db($con, "db_school");
mysqli_query($con, 'set names utf8');
$sql = "select * from tb_student";
$sql = $sql." where sex = '女'";
$result = mysqli_query($con, $sql);
if($result){
echo "<font color='green'>🎉🎉查询成功!</font><br>";
if(mysqli_data_seek($result, 2)){
$array = mysqli_fetch_array($result, MYSQLI_NUM);
echo "数据库db_school中第3位女生是:".$array[1];
}
else echo "<font color='red'>🙅🙅记录定位失败!</font>";
}
else echo "<font color='red'>🙅🙅查询失败!</font>";
?>

关闭数据库服务器的连接

对MySQL数据库的操作执行完毕后,应当及时关闭与MySQL数据库服务器的连接,以释放其所占用的系统资源。在PHP5中,可以使用函数mysql_close()来关闭由函数mysql_connect()所建立的与MySQL数据库服务器的非持久连接。语法格式为:

1
mysql_close([connection])

该函数的返回值为布尔型。
例如,编写一个关闭数据库连接的程序:

首先我把con.php稍稍修改来一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/**
* 连接mysql数据库
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/6
* Time: 22:22
*/
$host = "localhost:3306";
$user = "root";
$password = "12345";
$con = mysqli_connect($host, $user, $password);
if($con){
echo "<font color='green'>🎉🎉连接成功!</font><br>";
}
else echo "<font color='red'>🙅🙅连接失败!</font>";
?>

然后在编写关闭程序close.php:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
/**
* 关闭连接
* Created by PhpStorm.
* User: mr.cheng
* Date: 2018/9/7
* Time: 13:02
*/
require "con.php";
$close = mysqli_close($con);
if($close) echo "关闭完成!";
else "关闭失败!";

# MySQL, PHP

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了659.4k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×