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); } } ?>
1.5 PHP基础+1.5.1 访问数据库的更多相关文章
- 事物的隔离级别与并发完美体现了cap理论(确保数据完整、安全、一致性,在此基础上实现高性能访问(鱼和熊掌不可兼得)
事物的隔离级别与并发完美体现了cap理论(确保数据完整.安全.一致性,在此基础上实现高性能访问(鱼和熊掌不可兼得)
- .Net程序员学用Oracle系列(16):访问数据库(ODP.NET)
1..Net for Oracle 常见数据库驱动 1.1.微软提供的驱动 1.2.甲骨文提供的驱动 1.3.其它厂商提供的驱动 2.ODP.NET 常见问题分析 2.1.参数化问题 2.2.方法调用 ...
- Jdbc访问数据库篇
一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...
- Spring Boot中使用JdbcTemplate访问数据库
本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...
- 使用JdbcTemplate访问数据库
参考源端:https://blog.csdn.net/liaodehong/article/details/76974827 今天用Spring Boot访问一下数据库,并且把数据返回到页面中,进行增 ...
- 2017.11.12 web中JDBC 方式访问数据库的技术
JavaWeb------ 第四章 JDBC数据库访问技术 在JavaWeb应用程序中数据库访问是通过Java数据库连接(JavaDateBase Connectivity简称JDBC)数据库的链接一 ...
- asp访问数据库原理以及代码
ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术.可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Co ...
- javaweb三、JDBC访问数据库
JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的 ...
- Vert.x 异步访问数据库 MySQL
Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API. Vert.x提供的 ...
随机推荐
- Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)
题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...
- Codeforces Round #654 (Div. 2) B. Magical Calendar (结论)
题意:你需要在长度从\(1\)~\(k\),宽度无限的网格图中造图形(每个点四周必须连通),问最多能造出多少种不同的图形. 题解:感觉没什么好说的,就是画图找规律,如果\(r\ge n\)的话(即没有 ...
- 树状数组 && 板子
本文树状数组讲解转载于:https://www.cnblogs.com/xenny/p/9739600.html 本文新加内容为模板代码部分 1.什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗 ...
- WSL2 VS Code远程开发准备
上一节我们在linux中创建了mvc项目,但是要是在linux中用命令行直接开发的话,就有些扯了. 我们可以使用VS Code进行远程开发,简单来说,就是在windows中打开VS Code,打开Li ...
- Tomcat连接配置
DBCP连接池配置: <bean class="org.apache.tomcat.jdbc.pool.PoolProperties"> <property na ...
- SPOJ PHRASES Relevant Phrases of Annihilation(后缀数组 + 二分)题解
题意: 给\(n\)个串,要你求出一个最长子串\(A\),\(A\)在每个字串至少都出现\(2\)次且不覆盖,问\(A\)最长长度是多少 思路: 后缀数组处理完之后,二分这个长度,可以\(O(n)\) ...
- 51nod 1384 可重集的全排列
对于1231,121,111等有重复的数据,我们怎么做到生成全排列呢 实际上,对于打标记再释放标记的这种方法,如果一开始第一层递归访问过1那么你再访问 就会完全重复上一次1开头的情况,那么递归地考虑这 ...
- SwiftUI error All In One
SwiftUI error All In One Instance member xxx cannot be used on type yyy Instance member 'game' canno ...
- 钉钉 & URL Scheme & Universal Link & Deep Link
钉钉 & URL Scheme & Universal Link & Deep Link DD link https://www.cnblogs.com/xgqfrms/p/1 ...
- Learning JavaScript with MDN & 使用 MDN 学习 JavaScript
Learning JavaScript with MDN & 使用 MDN 学习 JavaScript Learn JavaScript with MDN 和 MDN 一起学习 JavaScr ...