(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. linux下alias命令具体解释

    linux下alias命令具体解释 用途说明 设置命令的别名.在linux系统中假设命令太长又不符合用户的习惯,那么我们能够为它指定一个别名. 尽管能够为命令建立"链接" 解决长文 ...

  2. 【bzoj4196】[Noi2015]软件包管理器

    裸的树链剖分. 对于安装 查询和维护到根路径 对于卸载 查询和维护子树信息 一开始线段树add[]标记要全赋值为-1 #include<algorithm> #include<ios ...

  3. python time 时间模块

    time():获取当前系统的时间戳ctime():以人类可读的方式打印当前系统时间sleep():接受一个参数,表示休眠时间 #!/usr/bin/env python #coding:utf8 im ...

  4. JeePlus:代码生成器

    ylbtech-JeePlus:代码生成器 1.返回顶部 1. 代码生成器Jeeplus代码生成器可以快速提高你的开发效率代码生成器可以0编码快速开发,通过配置生成数据库,mapper,service ...

  5. bzoj3884

    http://www.lydsy.com/JudgeOnline/problem.php?id=3884 拓展欧拉定理 http://blog.csdn.net/Pedro_Lee/article/d ...

  6. http-2.2

    HTTP-2.2 httpd 配置文件的组成: grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global En ...

  7. sqlserver2000连接失败,不存在或拒绝访问

    一 看ping 服务器IP能否ping通. 这个实际上是看和远程sql server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务 ...

  8. Linux下 FACL详解

    1. 什么是ACL ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置 ACL可以针 ...

  9. hdu1512 Monkey King(并查集,左偏堆)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题目大意:有n个猴子,一开始每个猴子只认识自己.每个猴子有一个力量值,力量值越大表示这个猴子打架 ...

  10. mysql——免安装配置

    1.下载 (1)下载地址:https://dev.mysql.com/downloads/mysql/ (2)选择下载 2.配置环境变量 (1)解压目录:D:\mysql-8.0.16-winx64 ...