1.5 PHP基础-1.5.1访问数据库

这篇博客介绍了PHP如何使用MySQLi模块访问MySQL数据库,包括构造函数、数据库连接、执行SQL语句和其他相关函数的实现。文章详细讲解了类的定义,特别是构造函数、数据库连接过程,以及如何执行SQL语句和关闭数据库连接。

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);
    }

}

?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值