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

    }

} 

?>

1.5 PHP基础+1.5.1 访问数据库的更多相关文章

  1. 事物的隔离级别与并发完美体现了cap理论(确保数据完整、安全、一致性,在此基础上实现高性能访问(鱼和熊掌不可兼得)

    事物的隔离级别与并发完美体现了cap理论(确保数据完整.安全.一致性,在此基础上实现高性能访问(鱼和熊掌不可兼得)

  2. .Net程序员学用Oracle系列(16):访问数据库(ODP.NET)

    1..Net for Oracle 常见数据库驱动 1.1.微软提供的驱动 1.2.甲骨文提供的驱动 1.3.其它厂商提供的驱动 2.ODP.NET 常见问题分析 2.1.参数化问题 2.2.方法调用 ...

  3. Jdbc访问数据库篇

    一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...

  4. Spring Boot中使用JdbcTemplate访问数据库

    本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...

  5. 使用JdbcTemplate访问数据库

    参考源端:https://blog.csdn.net/liaodehong/article/details/76974827 今天用Spring Boot访问一下数据库,并且把数据返回到页面中,进行增 ...

  6. 2017.11.12 web中JDBC 方式访问数据库的技术

    JavaWeb------ 第四章 JDBC数据库访问技术 在JavaWeb应用程序中数据库访问是通过Java数据库连接(JavaDateBase Connectivity简称JDBC)数据库的链接一 ...

  7. asp访问数据库原理以及代码

    ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术.可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Co ...

  8. javaweb三、JDBC访问数据库

    JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的 ...

  9. Vert.x 异步访问数据库 MySQL

    Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API. Vert.x提供的 ...

随机推荐

  1. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)

    题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...

  2. Codeforces Round #654 (Div. 2) B. Magical Calendar (结论)

    题意:你需要在长度从\(1\)~\(k\),宽度无限的网格图中造图形(每个点四周必须连通),问最多能造出多少种不同的图形. 题解:感觉没什么好说的,就是画图找规律,如果\(r\ge n\)的话(即没有 ...

  3. 树状数组 && 板子

    本文树状数组讲解转载于:https://www.cnblogs.com/xenny/p/9739600.html 本文新加内容为模板代码部分 1.什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗 ...

  4. WSL2 VS Code远程开发准备

    上一节我们在linux中创建了mvc项目,但是要是在linux中用命令行直接开发的话,就有些扯了. 我们可以使用VS Code进行远程开发,简单来说,就是在windows中打开VS Code,打开Li ...

  5. Tomcat连接配置

    DBCP连接池配置: <bean class="org.apache.tomcat.jdbc.pool.PoolProperties"> <property na ...

  6. SPOJ PHRASES Relevant Phrases of Annihilation(后缀数组 + 二分)题解

    题意: 给\(n\)个串,要你求出一个最长子串\(A\),\(A\)在每个字串至少都出现\(2\)次且不覆盖,问\(A\)最长长度是多少 思路: 后缀数组处理完之后,二分这个长度,可以\(O(n)\) ...

  7. 51nod 1384 可重集的全排列

    对于1231,121,111等有重复的数据,我们怎么做到生成全排列呢 实际上,对于打标记再释放标记的这种方法,如果一开始第一层递归访问过1那么你再访问 就会完全重复上一次1开头的情况,那么递归地考虑这 ...

  8. SwiftUI error All In One

    SwiftUI error All In One Instance member xxx cannot be used on type yyy Instance member 'game' canno ...

  9. 钉钉 & URL Scheme & Universal Link & Deep Link

    钉钉 & URL Scheme & Universal Link & Deep Link DD link https://www.cnblogs.com/xgqfrms/p/1 ...

  10. Learning JavaScript with MDN & 使用 MDN 学习 JavaScript

    Learning JavaScript with MDN & 使用 MDN 学习 JavaScript Learn JavaScript with MDN 和 MDN 一起学习 JavaScr ...