封装MySQL的单例,连接数据库并对数据进行增删改查操作
单例:
一个类只能有一个对象
应用场景:多次请求数据库只需要一个连接对象。
实现:三私一公
1、私有的静态属性用来保存对象的单例
2、私有的构造方法用来阻止在类的外部实例化
3、私有的__clone阻止在类的外部clone对象
4、公有的静态方法用来获取对象的单例
实现封装MySQL单例的思路:
第一步:实现单例
第二步:初始化参数
第三步:连接数据库
第四步:操作数据
1、执行数据操作语句(增、删、改)
2、执行数据查询语句
a) 返回二维数组
b) 返回一维数组
c)返回一行一列
代码的实现:
<?php
class MySQLDB {
private static $instance;//私有的静态属性用来保存对象的单例
private $host;
private $port;
private $user;
private $pwd;
private $charset;
private $link;
private $dbname;
//私有的构造方法用来阻止在类的外部实例化
private function __construct($param){
$this->initData($param);
$this->connectDB();
}
//私有的__clone阻止在类的外部clone对象
private function __clone(){ }
//获取单例,公有的静态方法用来获取对象的单例
static function getInstance($param){
if(!self::$instance instanceof self){
self::$instance = new self($param);
}
return self::$instance;
}
//初始化参数
private function initData($param = array()){
$this->host = $param['host']??'127.0.0.1';
$this->port = $param['port']??'3306';
$this->user = $param['user']??'';
$this->pwd = $param['pwd']??'';
$this->dbname = $param['dbname']??'';
$this->charset = $param['charset']??'utf8';
}
//连接数据库
private function connectDB(){
$this->link =@mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);
if(!$this->link){
echo '连接数据库失败';
echo '错误:'.mysqli_connect_error,'<br>';
echo '错误码:'.mysqli_connect_errno,'<br>';
exit;
}
mysqli_set_charset($this->link,$this->charset);
}
//执行数据库的增、删、改、查语句
private function executeSQL($sql){
$rs = mysqli_query($this->link,$sql);
if(!$rs){
echo '执行sql语句失败';
echo '错误:'.mysqli_error($this->link);
echo '错误码:'.mysqli_errno($this->link);
exit;
}
return $rs;
}
//执行增、删、改 并返回执行结果(true 或 false)
function executeZSG($sql){
if(in_array(substr($sql,0,6),array('delete','update','insert'))){
return $this->executeSQL($sql);
}else{
echo '非法访问<br>';
exit;
}
}
//获取自动增长的编号
function getIncrement(){
return mysqli_insert_id($this->link);
}
//执行查询语句
private function query($sql){
if(substr($sql,0,4) == 'desc' || substr($sql,0,4) == 'show' || substr($sql,0,6) == 'select'){
return $this->executeSQL($sql);
}else{
echo '非法访问<br>';
exit;
}
}
// 执行查询语句,返回二维数组
function fetchAll($sql,$type='assoc'){
$rs = $this->query($sql);
$type = $this->getType($type);
return mysqli_fetch_all($rs,$type);
}
//匹配一维数组
function fetchRow($sql,$type='assoc'){
$list = $this->fetchAll($sql,$type);
if(!empty($list)){
return $list[0];
}
return array();
}
//匹配一行一列
function fetchColumn($sql){
$list = $this->fetchAll($sql,'num');
if(!empty($list)){
return $list[0];
}
return null;
}
//获取匹配类型
private function getType($type){
switch($type){
case 'num':
return MYSQLI_NUM;
case 'both':
return MYSQLI_BOTH;
default:
return MYSQLI_ASSOC;
}
} }
$param = array(
'user' => 'root',
'pwd' => 'root',
'dbname' => 'mycool'
);
//获取单例
$db=MySQLDB::getInstance($param);
// var_dump($db);
//更新
// $db->executeZSG("update b set age=122 where id=11");
//插入
// if($db->executeZSG("insert into b values (null,55,66,22)"))
// echo '编号是:'.$db->getIncrement();
// 删除
// if($db->executeZSG("delete from b where id=11"))
// echo '删除成功';
//查询
// $list=$db->fetchAll('select * from b','assoc');
// var_dump($list);
// $list=$db->fetchRow('select * from b where id=9','num');
// var_dump($list);
// $list=$db->fetchColumn('select count(*) from b','assoc');
// var_dump($list);
小结一下:
1、instanceof 用来判断对象是否属于某个类
2、参数必须从外部传递到内部,不能写死到类的内部。
3、为了保证代码的可重用性,一个方法只实现一个功能,所以初始化参数和连接数据库分到两个方法中。
封装MySQL的单例,连接数据库并对数据进行增删改查操作的更多相关文章
- Python教程:连接数据库,对数据进行增删改查操作
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
- Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查
5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...
- 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例
main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...
- Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查
本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...
- 通过jdbc连接MySql数据库的增删改查操作
一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...
- Node.js + MySQL 实现数据的增删改查
通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...
- mysql学习笔记一 —— 数据的增删改查
1.连接mysql mysql 直接回车(是以root身份,密码空,登陆的是本机localhost) [root@www mysql]# mysql -uroot -p123 -S /var/lib/ ...
- python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作
pymysql模块 pymysql是用python控制终端对MySQL数据库进行操作的第三方模块 import pymysql # 1.连接数据库 client = pymysql.connect( ...
随机推荐
- 在JavaScript中闭包的作用和简单的用法
在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...
- B. Drazil and His Happy Friends
这是 Codeforces Round #292 (Div. 2)的一道题,原题在这里,题意就是: 小明有n个男同学(编号为 0 ~ n-1)和m个女同学 (编号为 0 ~ m-1),小明要安排男女之 ...
- 【LeetCode-easy】Merge Two Sorted Lists
思路:指针p用于串联怎个链表,比较两个指针的大小,连接较小的一个.如果一个链表到达链尾,连接另外一个链表余下来的所以节点. public ListNode mergeTwoLists(ListNode ...
- 开始使用Python
1. 开始使用Python 1.1 print使用str()函数显示对象,而交互式解释器调用repr()函数来显示对象. 1.2 在解释器中_表示最后一个表达式的值. 1.3 >>用来重定 ...
- Linux-3.14.12内存管理笔记【kmalloc与kfree实现】【转】
本文转载自:http://blog.chinaunix.net/uid-26859697-id-5573776.html kmalloc()是基于slab/slob/slub分配分配算法上实现的,不少 ...
- ES6 Set数据结构
Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const s = new Set(); // const声明一个只读的常量.一旦声明,常量的值就不能 ...
- C语言中数据类型和变量
C语言中的数据类型 数据类型的本质,固定大小内存块的别名. 数组名代表数组首元素的地址. 数组首元素的地址,&代表整个数组的地址. 数组数据类型,怎么定义数据数组类型,定义数组类型指针,数组类 ...
- 用CSS实现新闻轮播效果
CSS: /* Make it a marquee */ .marquee { width: 450px;margin: 0 auto;overflow: hidden;white-space: no ...
- 【LeetCode】046. Permutations
题目: Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] ha ...
- 红黑树的C语言实现
rbtree.h #ifndef _RED_BLACK_TREE_H_ #define _RED_BLACK_TREE_H_ #define RED 0 // 红色节点 #define BLACK 1 ...