1.5 PHP基础+1.5.1 访问数据库
水流云在2019 人气:0PHP作为流行的网站开发语言,具有上手简单,运行速度快的特点,它和javascript类似,无需定义变量类型,免去了使用者要对变量类型转换的烦恼,当然了,这就要求我们要对变量类型隐式转换过程予以关注。总之,PHP语言使用方便,也是本文所使用的主要语言之一。
在这里,我们仍然延续上一章的案例,并使用PHP对主要业务逻辑进行实现。
第一,我们需要一种高效、便捷、通用的数据库访问方式,能够使PHP和MySQL就行协同;
第二,要分析和实现基本的教学、选课操作,为前台展示提供必要的业务接口;
第三,要分析和实现学生信息维护、教师信息维护和课程信息维护等后台管理的功能,增强系统的可扩展性;
第四,逻辑接口要有通用性,能够对接当前流行的前端设计,尤其是满足可供微信服务号使用的接口设计。
基于以上分析,本节所涉及的系统设计如下,
其中,如上图所示,PHP所负责部分主要有3处,访问数据库、前端业务逻辑、后台业务逻辑,下面分3小节进行描述。
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 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; } }
对于上述函数,需要说明的是,这里使用了判断语句“if”,这是控制程序走向的重要语句,if后面的条件成立时,将执行条件后面{}里面的内容,上述例子中,第一个“if”是说,如果mysql连接(或者说是登录)不成功,则执行{}里面的显示出错信息,返回false,退出函数执行。(这里注意条件判断中的“!”,这是“非”的意思,就是与其后面的语句相反的意思,后面的语句是“成功连接数据库”加上一个“非”,就是“连接数据库不成功”的意思)
第二个“if”是选择数据库不成功,则执行显示“没有这个数据库”错误,并返回false,退出函数执行。
(3)执行SQL语句
Mysqli提供了执行SQL语句的函数,我们直接调用该函数即可。
// 执行查询语句,支持增加、删除、修改、查询等多种SQL语句 function query($sql) { $this->sql = $sql; $query = mysqli_query($this->conn, $this->sql); return $query; }
(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); } } ?>
加载全部内容