PHP封装数据库
(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封装数据库的更多相关文章
- 关于JPA封装数据库数据到实体不调用属性的get和set的方法解决办法
今天发现JPA封装数据库数据到实体并不调用属性的get和set的,郁闷,本来想在set方法做改字段的值处理的谁知道遇到这个情况: @Column(name = acode) @Access(value ...
- PreparedStatement实现表数据的增删改 & 封装数据库链接和关闭操作
PreparedStatement实现表数据的增删改 PreparedStatementUpdateTest package com.aff.PreparedStatement; import jav ...
- IOS开发-封装数据库sqlite3之为何选择FMDB
为什么使用第三方轻量级框架FMDB? FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语 ...
- 通过hibernate封装数据库持久化过程回顾泛型/继承/实现等概念
前言 在开发过程中,我们不难发现,客户的需求以及产品的定位对开发内容的走向有很大的决策作用,而这些往往需要在一开始就尽可能考虑周全和设计完善.为什么说是尽可能,因为我们都知道,需求这种东西,一言难尽. ...
- 封装数据库配置文件App配置文件
<connectionStrings> <add name="strCon" connectionString="Data Source=.;Ini ...
- 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类
一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...
- node.js连接数据库基本操作、封装数据库操作,输出到网页
声明:以下代码测试通过,不同于直接的复制粘贴乱七八糟未测试的代码,完全可以用,最后会附上所有的代码和sql文件 首先建立表,建表语句如下: /* SQLyog Ultimate v12.08 (64 ...
- node.js封装数据库增删改查
数据库增删改查的封装 小编不容易 const sql = { insert: function (Collection, insertData) { return new Promise((resol ...
- 封装数据库mysql, mysqli
<?php header("content-type:text/html;charset=utf-8"); class db{ //私有的静态属性 private ...
随机推荐
- hdu 3006 The Number of set(思维+壮压DP)
The Number of set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Python开发【第*篇】【模块】
模块分为三种: 自定义模块 第三方模块 内置模块 1.模块导入 import model from model.xx.xx import xx from model.xx.xx import xx a ...
- 【bzoj1269】[AHOI2006]文本编辑器editor
在bzoj上乱翻,发现了可持久化并查集,然后baidu了一下,发现一种叫rope的东西. !!!真的太爽了!!! 直接上代码,感受一下(也是蒯来的). 由于rope的底层实现,in ...
- beego3---gohttp底层实现
package main //gohttp底层实现,通过gohttp不是通过beego实现的输出 // import ( "io" "log" "ne ...
- CodeFirst建模:DataAnotation
示例一 新建一个控制台应用程序,并安装entityframework 新建一个文件Blog.cs类,输入以下代码: using System.ComponentModel.DataAnnotation ...
- 【前端】JavaScript表达式-新手必看
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6145384.html 一.什么是表达式 表达式就是JavaScript里一个短句,JavaScript解释器会将 ...
- 论如何O(1)快速乘
然而并没有什么好论的... 直接贴代码算了... ll Mul(ll x,ll y,ll Mod){ x=(x%Mod+Mod)%Mod;y=(y%Mod+Mod)%Mod; return (x*y- ...
- POJ 2104 HDU 2665 主席树 解决区间第K大
两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R ...
- FreeMarker:什么是 FreeMarker?
ylbtech-FreeMarker:什么是 FreeMarker? 1.返回顶部 1. FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电 ...
- java用户角色权限设计
实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台 ...