(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. Cocos2d-X开发中国象棋《四》设计游戏场景

    设计完開始界面后就要设计游戏界面了 为了理清设计思路先看一张游戏界面效果图 游戏界面设计思路: 1.在窗体上放一张桌子 2.在桌子上放一个棋盘 3.在棋盘右边加入新局button,暂不实现详细的功能 ...

  2. java SocketChannel and ServerSocketChannel

    1 SocketChannel 1.1 打开一个SocketChannel SocketChannel socketChannel = SocketChannel.open(); socketChan ...

  3. 单条insert

    ugc_l = browser.find_elements_by_class_name('ugc-item') try: myl = [{'statistics': i.text.replace('阅 ...

  4. HDU 1023 Catalan数+高精度

    链接:HDU 1023 /**************************************** * author : Grant Yuan * time : 2014/10/19 15:5 ...

  5. 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) S Surf

    SurfNow that you've come to Florida and taken up surng, you love it! Of course, you've realized that ...

  6. CANopen——笔记

    1. c语言的typedef高级用法 typedef void (*post_sync_t)(CO_Data*); http://zhidao.baidu.com/link?url=_lDBGq_uk ...

  7. Create schema error (unknown database schema '')

    Andrey Devyatka 4 years ago Permalink Raw Message Hi,Please tell me, can I use the static library in ...

  8. NOIP 2011 Mayan游戏 大暴搜

    题目链接:https://www.luogu.org/problemnew/show/P1312 我的第一篇题解!! 当然感谢ZAGER 的提示,他的链接https://www.cnblogs.com ...

  9. 8 种提升ASP.NET Web API性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  10. AtCoder Regular Contest 099 C~E

    C - Minimization 枚举就可以了 因为最后一定会变成1,所以第一次操作的区间就包含1会比较优,然后枚举1在第一次操作区间里排第几个取min即可 #include<iostream& ...