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 ...
随机推荐
- 解决myeclipse在mac中Retina屏幕中模糊的终极详细方法
- Android默认系统声音/大小修改及配置【转】
本文转载自:http://blog.csdn.net/a8316124/article/details/60574859 在做定制需求的时候,需要修改系统通知的声音,将其禁用掉,避免第三方应用发送通知 ...
- 准确率,精确率,召回率,F-measure 之间的关系
总结:(图上 R的计算的分母应该是 :40+10 )(笔误) 模型条件放宽,负类被误判为正类的可能性就变大(即FP变大)精确率和准确率会受影响(变小) 模型条件变严格,正类有可能被误判为负类(即FN变 ...
- E20180127-hm
retain vt. 保持; 留在心中,记住; 雇用; 付定金保留;
- 【废弃中】【WIP】JavaScript 数组
创建: 2018/01/22 更新: 2018/05/20 把此博文加入[javascript]分类, 原来忘记了 废弃: 2019/02/19 重构此篇.原文归入废弃 增加[废弃中]标签与总体任务 ...
- E2017614-hm
pluck n. 勇气,精神; 内脏; 快而猛的拉; 〈俚〉不及格; vt. 拔掉; 采,摘; 鼓起(勇气等); 弹(乐器); scope n. (处理.研究事务的) 范围; 眼界,见识 ...
- bzoj 1628: [Usaco2007 Demo]City skyline【贪心+单调栈】
还以为是dp呢 首先默认答案是n 对于一个影子,如果前边的影子比它高则可以归进前面的影子,高处的一段单算: 和他一样高的话就不用单算了,ans--: 否则入栈 #include<iostream ...
- bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2989 Solved: 1557[Submit][Statu ...
- window后台运行java jar文件
第一种需要一直开着dos界面: java -jar jar文件路径 第二种无需一直开着dos界面: 1.新建my-service.bat文件,内容如下: @echo off START "m ...
- Java多线程(九) synchronized 锁对象的改变
public class MyService { private String lock = "123"; public void testMethod() { synchroni ...