单例:

一个类只能有一个对象

应用场景:多次请求数据库只需要一个连接对象。

实现:三私一公

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的单例,连接数据库并对数据进行增删改查操作的更多相关文章

  1. Python教程:连接数据库,对数据进行增删改查操作

    各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...

  2. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  3. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

  4. 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例

    main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...

  5. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  6. 通过jdbc连接MySql数据库的增删改查操作

    一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...

  7. Node.js + MySQL 实现数据的增删改查

    通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...

  8. mysql学习笔记一 —— 数据的增删改查

    1.连接mysql mysql 直接回车(是以root身份,密码空,登陆的是本机localhost) [root@www mysql]# mysql -uroot -p123 -S /var/lib/ ...

  9. python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作

    pymysql模块 pymysql是用python控制终端对MySQL数据库进行操作的第三方模块 import pymysql # 1.连接数据库 client = pymysql.connect( ...

随机推荐

  1. Android适配API23之后权限的动态申请

    一.权限介绍 对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要 ...

  2. Django+ajax+jsonp实现借口调用文本处理

    首页 提交 <script src="/static/jquery-2.1.4.min.js"></script> <script type=&quo ...

  3. EOF的使用

    1.我疑惑了 char a[20]; while(scanf("%s",a)!=EOF){ cout<<"hello"<<endl; } ...

  4. Eclipse_插件_02_jd-eclipse插件的安装

    1.去官网下载 jd-eclipse插件 2.解压后的文件夹A放到eclipse的drops文件夹下 3.删掉多余文件,确保文件夹A下只有plugin 和 freature 两个文件夹 4.清空osg ...

  5. osx快捷键表示图

  6. ACM学习历程—HDU1028 Ignatius and the Princess(组合数学)

    Ignatius and the Princess Description        "Well, it seems the first problem is too easy. I w ...

  7. BZOJ3110:[ZJOI2013]K大数查询

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  8. 利用正则表达式类解析SQL语句,达到Worklist兼容各个RIS数据库的目的

    在做RIS的项目中遇到一个问题, 因为Worklist要兼容各个RIS数据库, 因此设计了目前这个架构. 1.xml文件来配置RIS数据库的数据源, 2.xml文件来存储关于查询/更新数据库的SQL语 ...

  9. saltstack syndic安装配置使用

    salt-syndic是做神马的呢?如果大家知道zabbix proxy的话那就可以很容易理解了,syndic的意思为理事,其实如果叫salt-proxy的话那就更好理解了,它就是一层代理,如同zab ...

  10. linux系统下file使用的magic文件格式说明

    magic 本手册是file命令所使用的magic文件的格式说明文档,版本是5.04. file命令用于识别文件类型,其他检测,检测文件内容中是否符合 'magic模式',也就是规则. /usr/sh ...