单例:

一个类只能有一个对象

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

实现:三私一公

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. iOS 多语言支持

    如果app将来面向国际化,比如说中国需要使用,美国也需要使用,此时就需要考虑app支持多国语言 具体方式如下 首先在Supporting Files中新建 Strings 起名: Localizabl ...

  2. property 中的strong 与weak

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *string1; @property ...

  3. debian7配置

    输入法: apt-get install ibus ibus-pinyin 并执行ibus-setup进行配置,首选项->输入法->中文,然后按添加按钮即可. 软件开发基本软件:apt-g ...

  4. CSS样式命名整理

    CSS样式命名整理 页面结构 容器: container/wrap 整体宽度:wrapper 页头:header 内容:content 页面主体:main 页尾:footer 导航:nav 侧栏:si ...

  5. leetcode 303. Range Sum Query - Immutable(前缀和)

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  6. MongoDB 使用经验笔记

    bin下的mongod就是MongoDB的服务端进程,mongo就是其客户端,其它的命令用于MongoDB的其它用途如MongoDB文件导出等 启动方式: 1.直接启动,指定各项参数: /usr/lo ...

  7. BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化

    BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...

  8. Java多线程加强

    一.传统多线程 public void start() Causes this thread to begin execution; the Java Virtual Machine calls th ...

  9. 百度地图API的第一次接触——自定义控件

    1.定义一个控件类,即function function ZoomControl(){ // 设置默认停靠位置和偏移量 this.defaultAnchor = BMAP_ANCHOR_TOP_LEF ...

  10. C# 对象间的 深拷贝 实现

        以下的这个类实现了 2个含有部分字段名字相同 的对象的 赋值拷贝. public class ShallowCopyHelper     {         public static voi ...