(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='0'); /*返回上一条语句影响的行数 */ 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()[0]; return $row; } public function getOne($sql){//查询单个数据 $res = $this->query($sql); $row = $res->fetch_row()[0];//查询出数组长度,即数据数量 return $row; } //$act='insert/update'控制插入和删除数据 public function Exec($data,$table,$act='insert',$where='0'){//自动创建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'=>'5601'],'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; ?>