(1)按照步骤封装数据库

①引入抽象类和抽象方法,即引入模板;

②继承抽象类,注意参数(规定几个就传入几个);

③逐个写入抽象方法,必须一一对应;(抽象方法必须一一引入,否则会报错-->有个抽象方法没有被实现)

④给抽象方法名加上方法体,即代码块;

(2)下面直接上代码,具体解析在代码里做了注释

<meta charset="utf-8">
<?php
abstract class aDB{
// 连接数据库,从配置文件读取配置信息
abstract public function coon();
/*发送query查询
* @param string $sql sql语句
* @return mixed
*/
abstract public function query($sql);
/*查询多行数据
*@param string $sql sql语句
* @return array
*/
abstract public function getAll($sql);
/*单行数据
*@param string $sql sql语句
* @return array
*/
abstract public function getRow($sql);
/*查询单个数据,如count(*)
*@param string $sql sql语句
* @return mixed
*/
abstract public function getOne($sql);
/*自动创建sql并执行,拼接sql语句
*@param array $data 关键数组 键值与表的列值对应
*@param string $table表名字
*@param string act 动作/update/insert
*@param string where 条件,用于update
*@return int 新插入的列的主键值或影响行数
*/
abstract public function Exec($data,$table,$act='insert',$where='');
/*返回上一条语句影响的行数
*/
abstract public function affectedRows();
}
class MySQL extends aDb{
//全局变量
public $link;
//构造函数,自动触发连接数据库
public function __construct(){
$this->coon();
}
//连接数据库,从配置文件读取配置信息(这里我写一个config配置文件)
public function coon(){
include './config.php';
// var_dump($cfg['host']);获取配置信息
//连接数据库,两种风格对比
// mysqli_connect();这里是过程化风格,下面是面向对象风格
$this ->link = new mysqli($cfg['host'],$cfg['user'],$cfg['pwd'],$cfg['db']);//返回连接数据库的版本等信息(常说的连接点)
$this->query('set name'.$cfg['charset']);//设置字符集
}
public function query($sql){
return $this->link->query($sql);
}
public function getAll($sql){
$data = [];
$res = $this->query($sql);
// mysqli_fetch_assoc();过程化风格,下面介绍下面向对象风格fetch_assoc
while ($row = $res->fetch_assoc()) {
$data[] = $row;
}
return $data;
}
public function getRow($sql){
//查询单条时,加上where条件即可,例如select* from user where id = 1
$res = $this->query($sql);
$row = $res->fetch_row()[];
return $row;
}
public function getOne($sql){//查询单个数据
$res = $this->query($sql);
$row = $res->fetch_row()[];//查询出数组长度,即数据数量
return $row;
}
//$act='insert/update'控制插入和删除数据
public function Exec($data,$table,$act='insert',$where=''){//自动创建sql并执行
if ($act == 'insert') {
//插入语句
//insert into 表名(id,name) values('2','tony')过程化风格
$sql = 'insert into '.$table .'(';
//array_keys()返回包含数组中所有键名的一个新数组
$sql.=implode(',',array_keys($data)).')';//将数组拆成字符串,用,分隔
// var_dump($sql); 到这步已经可以输出insert into user(name,money),还差values
$sql.= " values ('";
$sql.= implode("','",array_values($data))."')";//这里通过拼接字符串,插入values(注意单引号的拼接)
}else{
//更新语句****更新和删除操作必须加条件
//update xx set name='www',password='12' where ;
$sql = "update $table set ";
foreach ($data as $key => $value) {
$sql.= $key ."='".$value."',";
}
// var_dump($sql);此时输出结果会多一个,,所以下面来去掉,
$sql = rtrim($sql,',');
$sql.= " where $where";
var_dump($sql);
}
return $this->query($sql);
}
public function lastId(){//返回新增数据的id,新增数据时触发
return $this->link->insert_id;
}
public function affectedRows(){//影响行数
return $this->link->affected_rows;
}
}
$mysql = new MySQL();
var_dump($mysql->Exec(['name'=>'haizwi','password'=>''],'user','update',"name='tony'"));
var_dump($mysql->affectedRows());
?>

config.php:

<?php
$cfg = array(
'host' => 'localhost',
'user' => 'root',
'pwd' => 'root',
'db' => 'user',
'charset' => 'utf8'
);
return $cfg;
?>

PHP封装数据库的更多相关文章

  1. 关于JPA封装数据库数据到实体不调用属性的get和set的方法解决办法

    今天发现JPA封装数据库数据到实体并不调用属性的get和set的,郁闷,本来想在set方法做改字段的值处理的谁知道遇到这个情况: @Column(name = acode) @Access(value ...

  2. PreparedStatement实现表数据的增删改 & 封装数据库链接和关闭操作

    PreparedStatement实现表数据的增删改 PreparedStatementUpdateTest package com.aff.PreparedStatement; import jav ...

  3. IOS开发-封装数据库sqlite3之为何选择FMDB

    为什么使用第三方轻量级框架FMDB? FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语 ...

  4. 通过hibernate封装数据库持久化过程回顾泛型/继承/实现等概念

    前言 在开发过程中,我们不难发现,客户的需求以及产品的定位对开发内容的走向有很大的决策作用,而这些往往需要在一开始就尽可能考虑周全和设计完善.为什么说是尽可能,因为我们都知道,需求这种东西,一言难尽. ...

  5. 封装数据库配置文件App配置文件

    <connectionStrings>   <add name="strCon" connectionString="Data Source=.;Ini ...

  6. 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类

    一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...

  7. node.js连接数据库基本操作、封装数据库操作,输出到网页

    声明:以下代码测试通过,不同于直接的复制粘贴乱七八糟未测试的代码,完全可以用,最后会附上所有的代码和sql文件 首先建立表,建表语句如下: /* SQLyog Ultimate v12.08 (64 ...

  8. node.js封装数据库增删改查

    数据库增删改查的封装 小编不容易 const sql = { insert: function (Collection, insertData) { return new Promise((resol ...

  9. 封装数据库mysql, mysqli

    <?php header("content-type:text/html;charset=utf-8"); class db{    //私有的静态属性    private ...

随机推荐

  1. Gif验证码类

    package com.paic.bics.common.utils.vcode; import java.awt.AlphaComposite; import java.awt.Color; imp ...

  2. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] D "Or" Game 枚举+前缀后缀

                                                                            D. "Or" Game       ...

  3. python js

    js = 'var a=document.getElementsByClassName("user-data-right")[0];a.target="_self&quo ...

  4. 01排序的Java实现

    比赛描写叙述: 的个数同样时再按ASCII码值排序. 输入: 个字符. 输出: 串的顺序.使得串按基本描写叙述的方式排序. 例子输入: 例子输出: 被AC的代码例如以下: import java.ut ...

  5. leetcode 258. Add Digits——我擦,这种要你O(1)时间搞定的必然是观察规律,总结一个公式哇

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...

  6. 网络流之最大流算法(EK算法和Dinc算法)

    最大流 网络流的定义: 在一个网络(有流量)中有两个特殊的点,一个是网络的源点(s),流量只出不进,一个是网络的汇点(t),流量只进不出. 最大流:就是求s-->t的最大流量 假设 u,v 两个 ...

  7. BZOJ_1493_[NOI2007]项链工厂_Splay

    BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...

  8. 【BZOJ 3732】 Network

    [题目链接] 点击打开链接 [算法] 求出这个图的最小生成树,对于每次询问,用倍增法求出最近公共祖先,查询最小生成树上两点路径上的最大值 算法的正确性?            假设x和y在最小生成树中 ...

  9. CSYZDay1模拟题解

    T1.game [问题描述] LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+ ...

  10. E20171123-sl

    conform  vi. 符合; 遵照; 适应环境;               vi. 符合; 遵照; 适应环境;                 adj. 一致的; 顺从的; investigat ...