PHP作为流行的网站开发语言,具有上手简单,运行速度快的特点,它和javascript类似,都是对变量类型进行实时隐式转换的,免去了使用者要定义变量类型和显式转换的烦恼,当然了,这就要求我们要对变量类型时刻进行关注分析。总之,PHP语言使用方便,也是本文所使用的主要语言之一。
在这里,我们仍然延续上一章的案例,并使用PHP对主要业务逻辑进行实现。
第一,我们需要一种高效、便捷、通用的数据库访问方式,能够使PHP和MySQL进行协同;
第二,要分析和实现基本的教学、选课操作,为前台展示提供必要的业务接口;
第三,要分析和实现学生信息维护、教师信息维护和课程信息维护等后台管理的功能,增强系统的可扩展性;
第四,逻辑接口要有通用性,能够对接当前流行的前端设计,尤其是满足可供微信服务号使用的接口设计。
基于以上分析,本节所涉及的系统设计如下,

其中,如上图所示,PHP所负责部分主要有4处,访问数据库、前端业务逻辑、后台业务逻辑、接口返回,下面分4小节进行描述。
1.5.1 访问数据库
本文前面部署PHP时提到,PHP访问MySQL数据库需要使用MySQLi模块,即PHP已经封装好了访问MySQL数据库的方式方法,我们只需调用相应的接口函数实现即可。
在实现之前,需要先讲解一些PHP的基础知识。
定义一个文本文件为PHP脚本,不但其文件的后缀名应是.php,而且,在文本中,涉及PHP代码的部分,要用“<?php … ?>”包括起来。例如
<?php echo phpinfo(); ?>
下面我们学习一下PHP连接数据库的方法。为了代码能够复用,我们将数据库操作相关方法整合在一起,定义为一个“类”。
(这里,“类”是面向对象编程语言中一个基础概念,是对象的基本属性和方法的描述,用class表示)
如,我们定义数据库操作对象为
class DbMysql {
}
上述类定义中,“DbMysql”为类名,括号内部具体描述该类所具有的属性和方法。
经过上节——MySQL数据库命令中,我们知道,想要连接数据库,我们必须要知道MySQL服务器主机名称(例如:本地localhost或者127.0.0.1)、的用户名(例如:root)和密码(例如上节课中的123456)才能进入数据库,我们还需要知道数据库的名称(例如上节中的“db_edu_sys”)以便于能够将数据库切换至我们自建的数据库。
除了以上内容,我们还需要能够存储已经建立好的数据库链接标识,以便能够重复使用。
另一方面,我们设计数据库操作类的初衷就是为了能够通过它来进行SQL语句的操作,因此,我们还需要定义有关SQL操作的相关属性,主要有:操作的语句、操作后的结果以及出错时的错误信息等。
综合以上分析,我们可以将类定义如下:
class DbMysql {
//数据库连接时所需要的属性
private $dbhost; // 数据库主机,如:localhost:3306
private $dbuser; // 数据库用户名,如:root
private $dbpass; // 数据库用户名密码:123456
private $dbname; // 数据库名:db_edu_sys
// 数据库保持连接时需要的属性
private $conn; // 数据库连接标识
//执行SQL语句时需要的属性
private $sql; // sql执行语句:SELECT s_name FROM student
private $result; // 执行sql语句后返回的结果
private $error_msg; // 数据库出现错误时返回的错误提示
}
上面的例子中,属性前面的关键字“private”表明,该属性为DbMysql类“私有”的属性,其他类或外部操作无法访问该属性。
(注意:一般定义属性时,往往都是private的,如果希望其他类或外部函数访问该属性,可以通过定义属性读取函数将该属性的值作为返回值)
另,我们上述中提到的类的属性和方法,大家可以简单理解就是在类中定义的“变量”和“函数”。
下面我们讨论一下,该类中所需要的方法。
(1)构造函数:
一个类往往需要一个构造函数,这个构造函数主要功能就是对类的属性就行初始化,指定这些属性最初的值是什么。
这里的构造函数可以写成:
// 构造函数
function __construct($dbhost, $dbuser, $dbpass, $dbname = '') {
// 初始化数据库连接时所需要的属性
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
$this->dbname = $dbname;
// 进行数据库连接
$this->connect();
}
对于上述函数的实现,这里做一下说明:
参数如果写成“$dbname = ''”,表示这个参数有默认值,实际调用该函数时,处于这个位置的参数可以不赋值;没有默认值的参数,调用函数时则必须对其赋值。
在类定义函数中使用该类的属性时,需要使用“$this->”,否则认为是函数内部变量。使用类方法也要加“$this->”。
(2)数据库连接
数据库连接时,我们要使用mysqli进行mysql控制台的登录和数据库切换的操作,具体实现如下:
// 数据库连接
function connect() {
// 使用mysqli连接数据库
// 相当于在控制台中使用:mysql -u root -p
list($dbhost, $dbport) = explode(':', $this->dbhost);
if (!$this->conn = mysqli_connect($this->dbhost,
$this->dbuser, $this->dbpass,null, $dbport)) {
$this->error('Can not pconnect to mysql server');
return false;
}
// 连接成功,进入mysql控制台
// 使用mysqli切换数据库
// 相当于在控制台中使用:use db_edu_sys;
if (mysqli_select_db($this->conn, $this->dbname) === false ) {
$this->error("NO THIS DBNAME:" . $this->dbname);
return false;
}
}
对于上述函数,需要说明的是,这里使用了判断语句“if”,这是控制程序走向的重要语句,if后面的条件成立时,将执行条件后面{}里面的内容,上述例子中,第一个“if”是说,如果mysql连接(或者说是登录)不成功,则执行{}里面的显示出错信息,返回false,退出函数执行。(这里注意条件判断中的“!”,这是“非”的意思,就是与其后面的语句相反的意思,后面的语句是“成功连接数据库”加上一个“非”,就是“连接数据库不成功”的意思)
第二个“if”是选择数据库不成功,则执行显示“没有这个数据库”错误,并返回false,退出函数执行。
(3)执行SQL语句
mysqli提供了执行SQL语句的函数,我们直接调用该函数即可。
// 数据库连接
function connect() {
// 使用mysqli连接数据库
// 相当于在控制台中使用:mysql -u root -p
if (!$this->conn = mysqli_pconnect($this->dbhost,
$this->dbuser, $this->dbpass)) {
$this->error('Can not pconnect to mysql server');
return false;
}
// 连接成功,进入mysql控制台
// 使用mysqli切换数据库
// 相当于在控制台中使用:use db_edu_sys;
if (mysqli_select_db($this->conn, $this->dbname) === false ) {
$this->error("NO THIS DBNAME:" . $this->dbname);
return false;
}
}
(4)其他函数
最后,我们还要实现数据库的关闭和错误信息的显示,这样,一个简单的mysql数据库操作类就基本实现了。
本小节的最后,我们将整个DbMysql类的实现写在下面,供读者参考。
文件名:DbMysql.class.php
<?php
class DbMysql {
//数据库连接时所需要的属性
private $dbhost; // 数据库主机,如:localhost:3306
private $dbuser; // 数据库用户名,如:root
private $dbpass; // 数据库用户名密码:123456
private $dbname; // 数据库名:db_edu_sys
// 数据库保持连接时需要的属性
private $conn; // 数据库连接标识
//执行SQL语句时需要的属性
private $sql; // sql执行语句:SELECT s_name FROM student
private $result; // 执行sql语句后返回的结果
private $error_msg; // 数据库出现错误时返回的错误提示
// 构造函数
function __construct($dbhost, $dbuser, $dbpass, $dbname = '') {
// 初始化数据库连接时所需要的属性
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
$this->dbname = $dbname;
// 进行数据库连接
$this->connect();
}
// 数据库连接
function connect() {
// 使用mysqli连接数据库
// 相当于在控制台中使用:mysql -u root -p
if (!$this->conn = mysqli_pconnect($this->dbhost,
$this->dbuser, $this->dbpass)) {
$this->error('Can not pconnect to mysql server');
return false;
}
// 连接成功,进入mysql控制台
// 使用mysqli切换数据库
// 相当于在控制台中使用:use db_edu_sys;
if (mysqli_select_db($this->conn,
$this->dbname) === false ) {
$this->error("NO THIS DBNAME:" . $this->dbname);
return false;
}
}
// 执行查询语句,支持增加、删除、修改、查询等多种SQL语句
function query($sql) {
// 使用mysqli进行查询语句执行
// 相当于在控制台中使用该查询语句
$this->sql = $sql;
$query = mysqli_query($this->conn, $this->sql);
return $query;
}
// 关闭 MySQL 连接
function close() {
// 使用mysqli关闭数据库
// 相当于在控制台使用:exit
return mysqli_close($this->conn);
}
// 返回错误信息
function error($msg = '') {
$msg = $msg ? "database Error: $msg" :
'<b>MySQL server error report</b><br>' . $this->error_msg;
exit($msg);
}
}
?>
这篇博客介绍了PHP如何使用MySQLi模块访问MySQL数据库,包括构造函数、数据库连接、执行SQL语句和其他相关函数的实现。文章详细讲解了类的定义,特别是构造函数、数据库连接过程,以及如何执行SQL语句和关闭数据库连接。
372

被折叠的 条评论
为什么被折叠?



