//封装MySQL单例

class MySQLDB {

private $host;//主机地址

private $port;//端口号

private $user;//用户名

private $pwd;//密码

private $dbname;//数据接名

private $charset;//字符集

private $link;//连接对象

private static $instance;

private function __construct($param) {

$this->initParam($param);

$this->initConnect();

}

private function __clone() {

}

//获取单例

public static function getInstance($param=array()) {

if(!self::$instance instanceof self)

self::$instance=new self($param);

return self::$instance;

}

//初始化参数

private function initParam($param) {

$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 initConnect() {

$this->link=@mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);

if(mysqli_connect_error()){

echo '数据库连接失败

';

echo '错误信息:'.mysqli_connect_error(),'

';

echo '错误码:'.mysqli_connect_errno(),'

';

exit;

}

mysqli_set_charset($this->link,$this->charset);

}

//执行数据库的增、删、改、查

private function execute($sql) {

if(!$rs=mysqli_query($this->link,$sql)){

echo 'SQL语句执行失败

';

echo '错误信息:'.mysqli_error($this->link),'

';

echo '错误码:'.mysqli_errno($this->link),'

';

echo '错误的SQL语句:'.$sql,'

';

exit;

}

return $rs;

}

/**

*执行增、删、改

[email protected] bool 成功返回true,失败返回false

*/

public function exec($sql) {

$key=substr($sql,0,6);

if(in_array($key,array('insert','update','delete')))

return $this->execute($sql);

else{

echo '非法访问

';

exit;

}

}

//获取自动增长的编号

public function getLastInsertId() {

return mysqli_insert_id($this->link);

}

//执行查询语句

private function query($sql) {

if(substr($sql,0,6)=='select' || substr($sql,0,4)=='show' || substr($sql,0,4)=='desc'){

return $this->execute($sql);

}else{

echo '非法访问

';

exit;

}

}

/**

* 将查询结果改为二维数组

*执行查询语句,返回二维数组

*@$sql string 查询sql语句

[email protected] string assoc|num|both

*/

public function fetchAll($sql,$type='assoc') {

$rs=$this->query($sql);

$type=$this->getType($type);

//$rs代表从一个数据库查询中获取的结果集。

//mysqli_fetch_all 将所有结果行作为关联数组、数字数组或两者都提取

return mysqli_fetch_all($rs,$type);

}

//只有一条记录的时候 应该只返回一条记录

//匹配一维数组

public function fetchRow($sql,$type='assoc') {

$list=$this->fetchAll($sql,$type);

//如果二维数组不为空 则返回第一条数据

if(!empty($list))

return $list[0];

return array();

}

//匹配一行一列

//如 查询数据的条数 只需要一行实际内容就行

public function fetchColumn($sql) {

$list=$this->fetchRow($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;//如果没有传入则默认的ASSOC

}

}

}

//测试

//配置参数

$param=array(

'user'=>'root',

'pwd'=>'root',

'dbname'=>'data'

);

//获取单例

$db=MySQLDB::getInstance($param);

//更新

//$db->exec("update news set title='青草' where id=2");

//插入

/*

if($db->exec("insert into news values (null,'aa','bb',unix_timestamp())"))

echo '编号是:'.$db->getLastInsertId();

*/

//查询

//$list=$db->fetchAll('select * from news','aa');

//$list=$db->fetchRow('select * from news where id=1','aa');

$list=$db->fetchColumn('select count(*) from news');

echo '';

var_dump($list);

php打包mysql_PHP封装MySQL的单例相关推荐

  1. 封装mysql数据库操作系统_封装MySQL的单例,连接数据库并对数据进行增删改查操作...

    //私有的构造方法用来阻止在类的外部实例化private function __construct($param){$this->initData($param);$this->conne ...

  2. 身边的设计模式(一):单例 与 RedisCacheManager

    大家好,以后我会用23篇文章,来给大家讲解设计模式,当然如果你看过我的项目,很多设计模式已经很会了,只是没有注意到,我这里会讲解一下,大家就会发现,如果你看懂了我的项目,其实已经至少学会了六种设计模式 ...

  3. C++ 类中的static成员的使用及单例设计示例

    文章目录 static 静态成员变量 static静态成员函数 单例设计模式 单例实现图片资源的封装(很实用) 静态成员:被static修饰的成员变量\函数 可以通过对象(对象.静态成员).对象指针( ...

  4. php单例模式实现对象只被创建一次 mysql单例操作类

    这是我在php面试题中遇到的一道试题,单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费. ...

  5. Django验证码*短信验证码之2-容联云通讯短信平台(联云通讯短信平台介绍、容联云通讯Python SDK、封装发送短信单例类)

    容联云通讯短信平台介绍 容联云通讯网址:https://www.yuntongxun.com/ 容联云管理控制台 容联云创建应用 容联云通讯Python SDK https://doc.yuntong ...

  6. mysql 联合索引 单个索引_mysql的单例索引和联合索引

    --联合索引查询第一个.第二个参数(走索引) explain select* from emp where ENAME = 'wang' and JOB 单例索引:在数据库的单例上建立的索引. 联合索 ...

  7. Python 学习笔记 类的封装 类的继承 多态继承 类方法和静态方法 单例设计模式

    一.类的封装: 1.概念: 广义的封装:函数和类的定义本身,就是封装的体现 狭义的封装:一个类的某些属性,在使用的过程 中,不希望被外界直接访问,而是把这个属性给作为私有的[只有当前类持有],然后暴露 ...

  8. 2.vue3医疗在线问诊项目 - _登录模块 ==> 代码片段、css变量主题定制、cp-nav-bar组件封装、svg打包精灵图插件、cp-icon组件封装、表单校验、密码登录、短信验证码登录及两者

    2.医疗在线问诊项目 - _登录模块 ==> 代码片段.css变量主题定制.cp-nav-bar组件封装.svg打包精灵图插件.cp-icon组件封装.表单校验.密码登录.短信验证码登录及两者的 ...

  9. mysql为什么要单例_为什么要用单例,你真的会写单例模式吗

    优秀的设计结构可以规避很多潜在的性能问题,对系统性能的影响可能远远大于代码的优化,所以我们需要知道一些设计模式和方法. 单例模式: 单例模式是一种对象创建模式,用于生产一个对象的实例,它可以确保系统中 ...

最新文章

  1. three.js 调用网络摄像头
  2. 企业为什么要开通银企直联_企业为什么要把人事外包出去
  3. buu [GKCTF2020]小学生的密码学
  4. C# 之 用NPOI类库操作Excel
  5. windows和linux运算结果不同,从Windows和Linux读取文件会产生不同的结果(字符编码?)...
  6. 基于ssm框架和freemarker的商品销售系统
  7. 用Java实现图片验证码功能
  8. 上海芯导电子科技股份有限公司IPO过会
  9. C++新特性探究(四):Raw String Literals
  10. eclipse java jsp_Javaweb学习笔记4 使用Eclipse快速开发JSP
  11. DWR第五篇之文件上传
  12. 区块链项目开发最容易受区块链技术影响的行业
  13. 京东黑科技引爆车联网时代 你的爱车升级了吗?
  14. WebLogic 服务器概述 与 部署 Java Web 应用
  15. GPT分区表出现问题后的数据恢复思路
  16. 360全景倒车影像怎么看_360全景倒车影像开的时候能看到前面的状况吗
  17. 微信公众平台一直限制配置失败-106
  18. 嵌入式Linux的MiniGUI研究和移植
  19. 晏殊几何学导读花间流风方程定义与引理
  20. Mac的常用快捷键(包括数学字符)

热门文章

  1. 使用Jenkins来实现内部的持续集成流程(上)
  2. Canny边缘检测及C++实现
  3. 大数据的乘法实现——C语言
  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)...
  5. IOS启程06—iOS设置圆角图片
  6. Android倒计时案例展示
  7. .Net core下的配置设置(一)——Configuration
  8. Hadoop集群配置搭建
  9. Yii2-admin RBAC权限管理的实现
  10. Javascript笔记:(实践篇)从jQuery插件技术说起-分析extend方法的源码(发现extend方法里有bug)(下篇)...