1.5 PHP基础+1.5.1 访问数据库

PHP作为流行的网站开发语言,具有上手简单,运行速度快的特点,它和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);

    }


} 

?>