封装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( ...
随机推荐
- [2018-11-27]2018年12月1日宁波dotnet社区线下活动
离上次活动,转眼又过了一个月,幸得各路大神支持,于本周六(12月1日),宁波dotnet社区的线下分享活动又来啦! 活动嘉宾及主题 董斌辉 2015-2019年微软全球最有价值专家(.NET方向) 2 ...
- http://blog.csdn.net/renfufei/article/details/37725057/
版权声明:本文为博主原创文章,未经博主允许不得转载. 原创:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 ...
- java入门的语法学习
用java语言写了一个求两个数最大公约数的程序: import java.io.*; import java.util.*; import java.math.*; public class Main ...
- LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式 的解决方法
一.案例1,及解决方案: "LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式." ...
- 2018.3.1 RF module distance test part II-
1 Test circuit diagram 2 Test demo 3 Test record 4 Test analysis 5 Test results and discussion E ...
- 《java编程思想》:第五章,初始化与清理
知识点整理: 1.从概念上讲,‘初始化’与‘创建’是彼此独立的,但是在Java中,两者被捆绑在一起,不可分离. 2.区分重载的方法:每个重载的方法都有一个独一无二的参数类型列表. 甚至参数顺序的不同也 ...
- 基于jQuery Ajax实现无刷新文件上传
最近因项目需求更改,需要实现选择文件后即时上传至服务器,然后提交后,加载xls表格内容到jqgrid表格中,文件上传功能实现示例: 前端jsp页面: <form id="uploadF ...
- 作业2nd
1. 国内: 雷军作为中国互联网代表人物及环球年度电子商务创新首领人物,曾获中国经济年度人物及十大财智首领人物.中国互联网年度人物等多项国表里荣誉,并当选<福布斯>(亚洲版)2014年度贸 ...
- java面试题04
1.就你所熟悉的银行业务面说一下,越详细越好 银行经验:手机银行 网上银行经验 怎么支付 转账 了解基本业务 2.了解工作流的控制,审批流程以及帐务处理么? java中怎么实现工作流.审批流程 ...
- 【Lintcode】104.Merge k Sorted Lists
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...