一、概念
接口: interface
接口的名字常以小写i开头+类名(首字母大写);
接口中只定义方法名;
不具体实现方法;
方法必须是公共的public;
接口中的方法必须在类中全部实现
interface iClassname { public function method1($p...); public function method2($p...); }
在类中实现接口
用implements引入接口,可引入多个用,分隔
class Classname implements iClassname { public function method1($p...) { 方法1 } public function method2($p...) { 方法2 } }
二、定义接口
interface iCurd { //添加数据 public function write($data,$fields); //读取数据 public function read($fields); //更新数据 public function update($data,$where); //删除数据 public function delete($where); }
三、类中实现接口中的所有方法
先把接口中的方法都拷贝到类里,再逐个实现
class Db implements iCurd { //添加数据 public function write($data,$fields) { } //读取数据 public function read($fields) { } //更新数据 public function update($data,$where) { } //删除数据 public function delete($where) { } }
用接口方式实现对数据库的增删改查操作
1、连接数据库:在类的构造函数中实现 new PDO($dsn,$username,$password)
$dsn='mysql:host=html.io;dbname=phpsql'; //当省略host时相当于host=127.0.0.1
代码片断
//连接数据库 protected $pdo= null; protected $table; public function __construct($dsn,$user,$password,$table) { $this->pdo = new \PDO($dsn,$user,$password); $this->table = $table; }
2、通过对SQL语句的拼装实现方法
方法的实现的步骤:
第一步:对方法参数进行拼接处理;
第二步:拼接SQL语句字符串到$sql变量;
第三步:调用pdo->prepare($sql)方法生成$stmt预处理语句对象;
第四步:调用$stmt->execute()执行sql命令,有需要时execute()方法可传入数组参数$data;
注意:SQL语名进行拼接时注意SQL的命令语句体中的空格和括号;
:占位符后面不能有空格
运行代码出现问题时可用die()方法进行断点测试,帮助检查问题,在SQL语句拼接执行时,有时候是拼接的语句的问题,有时候是传入的参数的问题;
A.在类中实现write()方法
新增数据的SQL语句:INSERT INTO 表名 (字段列表) VALUES (值列表)
$data参数用来传入需添加的数组,$fields参数用来传入字段列表(数组)
public function write($data,$fields){}
方法具体实现代码:
下面的write方法中还可以只传入一个参数$data,用array_keys($data)方法取得字段列表数组,再进行拼接处理
public function write($data,$fields) { //添加数据的SQL语句体:INSERT INTO 表名 (字段列表) VALUES (值列表) //--->处理$fields传入的数组参数,将数组拼接成字段列表和占位符值列表 $_fields = ''; $_values = ''; foreach ($fields as $field){ $_fields .=$field. ', '; $_values .=':'. $field. ', '; } //去除最后一个', ',需包含空格 $_fields = rtrim($_fields,', '); $_values = rtrim($_values,', '); $_fields = ' ('. $_fields. ') '; $_values = ' ('. $_values. ') '; //<---数组参数处理完毕 //--->直接写入字段列表和值列表方式,当数据表变动时需修改此方法 //$fields = ' (name, age, sex, position, mobile, hiredate) '; //$values = ' (:name, :age, :sex, :position, :mobile, :hiredate) '; //<---不方便 //拼接成SQL语句,用字段名+占位符形式 $sql = 'INSERT INTO '. $this->table. $_fields. 'VALUES'. $_values; //生成sql预处理语句对象 $stmt = $this->pdo->prepare($sql); //执行SQL语句 if($stmt->execute($data)) { return [ 'count' => $stmt->rowCount(),//返回影响的行数 'id' => $this->pdo->lastInsertId()//返回自增id的值 ]; }else{ die('<pre>' . print_r($stmt->errorInfo(), true));//输出SQL语句执行的错误信息 } }
客户端代码:
--首先是实例化Db类,连接数据库
//-->Db类实例化, //自动连接数据库,需对不同表进行操作时仅修改$table即可 $dsn = 'mysql:host=html.io;dbname=phpsql'; //如果host省略相当于host=127.0.0.1 $user = 'root'; $password = 'root'; $table = 'staff'; $myDb =new Db($dsn,$user,$password,$table); //<--Db类实例化完成
--准备数据,执行增加数据操作
//--->增加数据开始 //表单字段 $fields=['name', 'age', 'sex', 'position', 'mobile', 'hiredate']; //需增加的数据 $data=[ 'name'=>'牛人', 'age'=>18, 'sex'=>1, 'position'=>'厕所所长', 'mobile'=>13888888888, 'hiredate'=>time() ]; //调用write方法增加数据 $res_arr = $myDb->write($data,$fields); echo '成功增加数据 '. $res_arr['count']. ' 条,staff_id: '. $res_arr['id']; //<---增加数据结束
B.在类中实现delete()方法
删除数据:DELETE FORM 表名 WHERE 条件
$where参数用来引入符合的条件,数据删除操作一定要有条件,慎用删除!
public function delete($where);
方法具体实现代码:
public function delete($where) { //删除数据SQL语句 DELETE FROM 表名 WHERE 条件 $sql = 'DELETE FROM '. $this->table. ' WHERE '. $where; $stmt = $this->pdo->prepare($sql); $stmt->execute(); }
客户端实现
注意$where字符串值里的符号的书写: $where = "name='牛人'"
//删除数据 $where = 'staff_id=12'; $myDb->delete($where);
C.在类中实现update()方法
修改数据:UPDATE 表名 SET 字段名=值,... 字段名=值 WHERE 条件
$data参数传入需更新的数据的数组,$where传入符合的条件
public function update($data,$where);
方法具体实现代码:
此方法中用到了array_keys(数组)方法,将$data数组的key取出返回到一个新数组中;
通过遍历这个新数组,拼接出‘ SET 字段名=:字段名, ... 字段名=:字段名, ’这样的$set字符串;
然后再用一个rtrim(字符串,' 特定字符/字符串')在右端剪除掉特定符号将$set字符串末尾的,去掉,注意,后应包含空格,与拼接的时候要一致;
public function update($data,$where) { //更新数据表SQL语句 UPDATE 表名 SET 字段名=值 WHERE 条件 $set = ' SET '; //对$data进行处理,取$data数组的键值 //array_keys(数组)方法获取数组中的键,返回一个新的数组 $key_arr = array_keys($data); foreach ($key_arr as $value){ //$set .= $value. ' =: '. $value. ', ';//此语句是错的,=:后面不能有空格 $set .= $value. ' =:'. $value. ', ';//点位符后不能有空格 } $set = rtrim($set,', '); $where = empty($where) ? '' : ' WHERE '. $where; $sql = 'UPDATE '. $this->table. $set. $where; //die(print_r($sql)); $stmt = $this->pdo->prepare($sql); //die(print_r($stmt)); if($stmt->execute($data)){ return $stmt->rowCount(); }else{ die('<pre>'.print_r($stmt->errorInfo(),true)); } }
客户端代码:
//--->更新开始 $data=[ 'age'=> 55, 'position'=>'小保姆' ]; //$where = "staff_id=11"; //$res_update=$myDb->update($data,$where); //echo '成功更新数据 '. $res_update. ' 条'; //<---更新完毕
D.在类中实现read()方法
查看数据:SELECT 字段列表 FROM 表名 WHERE 条件 LIMIT 'n,n+m'
public function read($fields);
方法具体实现代码:
$fields参数为一个数组,如里为空时查询所有,如果有字段名数组时,查询相应的字段值
public function read($fields,$where='',$limit='0,100') { //查看数据的SQL语句: SELECT 字段列表 FROM 表名 WHERE 条件 LIMIT n,n+m //注意字段列表前后无() //--->开始处理字段列表 $_fields = ''; if(empty($fields)){ $_fields = '*'; //die(print_r('$fields=*')); //测试是否进入此处 }else{ foreach ($fields as $field){ $_fields .=$field. ', '; } $_fields = rtrim($_fields,', '); //die(print_r($_fields)); //测试输出是否正确 //输出为name, mobile } //<---字段列表处理完毕 $where = empty($where) ? '' : ' WHERE '. $where; $sql = 'SELECT '. $_fields. ' FROM '. $this->table. $where. ' LIMIT '.$limit; $stmt = $this->pdo->prepare($sql); if($stmt->execute()){ return $stmt->fetchAll(\PDO::FETCH_ASSOC); }else{ die('<pre>'. print_r( $stmt->errorInfo(),true)); } }
客户端代码:
//--->查询开始 //$fields=['name', 'mobile']; $fields=''; $query_data = $myDb->read($fields); foreach ($query_data as $value){ print_r($value); echo '<br>'; } //<---查询结束
完整代码:
<?php namespace _1009\one; //一、声明接口,用interface关键字声明一个接口, // 接口名一般采用i开头+类名(首字母大写); // 接口中只定义方法的名称,不具体实现方法; // 接口中的方法必须声明为public; // 接口中的所有方法必须在类中实现; interface iCurd { //添加数据 public function write($data,$fields); //读取数据 public function read($fields); //更新数据 public function update($data,$where); //删除数据 public function delete($where); } //在类中必须实现接口中的所有方法 //用implements引入接口,可以引入多个接中,中间用逗号(,)分隔 class Db implements iCurd { //1.连接数据库 protected $pdo= null; protected $table; public function __construct($dsn,$user,$password,$table) { $this->pdo = new \PDO($dsn,$user,$password); $this->table = $table; } //添加数据 public function write($data,$fields) { //添加数据的SQL语句体:INSERT INTO 表名 (字段列表) VALUES (值列表) //--->处理$fields传入的数组参数,将数组拼接成字段列表和占位符值列表 $_fields = ''; $_values = ''; foreach ($fields as $field){ $_fields .=$field. ', '; $_values .=':'. $field. ', '; } //去除最后一个', ',需包含空格 $_fields = rtrim($_fields,', '); $_values = rtrim($_values,', '); $_fields = ' ('. $_fields. ') '; $_values = ' ('. $_values. ') '; //<---数组参数处理完毕 //直接写入字段列表和值列表方式,当数据表变动时需修改此方法 //$fields = ' (name, age, sex, position, mobile, hiredate) '; //$values = ' (:name, :age, :sex, :position, :mobile, :hiredate) '; //不方便 //拼接成SQL语句,用字段名+占位符形式 $sql = 'INSERT INTO '. $this->table. $_fields. 'VALUES'. $_values; //生成sql预处理语句对象 $stmt = $this->pdo->prepare($sql); //执行SQL语句 if($stmt->execute($data)) { return [ 'count' => $stmt->rowCount(),//返回影响的行数 'id' => $this->pdo->lastInsertId()//返回自增id的值 ]; }else{ die('<pre>' . print_r($stmt->errorInfo(), true));//输出SQL语句执行的错误信息 } } //读取数据 public function read($fields,$where='',$limit='0,100') { //查看数据的SQL语句: SELECT 字段列表 FROM 表名 WHERE 条件 LIMIT n,n+m //注意字段列表前后无() //--->开始处理字段列表 $_fields = ''; if(empty($fields)){ $_fields = '*'; //die(print_r('$fields=*')); //测试是否进入此处 }else{ foreach ($fields as $field){ $_fields .=$field. ', '; } $_fields = rtrim($_fields,', '); //die(print_r($_fields)); //测试输出是否正确 //输出为name, mobile } //<---字段列表处理完毕 $where = empty($where) ? '' : ' WHERE '. $where; $sql = 'SELECT '. $_fields. ' FROM '. $this->table. $where. ' LIMIT '.$limit; $stmt = $this->pdo->prepare($sql); if($stmt->execute()){ return $stmt->fetchAll(\PDO::FETCH_ASSOC); }else{ die('<pre>'. print_r( $stmt->errorInfo(),true)); } } //更新数据 public function update($data,$where) { //更新数据表SQL语句 UPDATE 表名 SET 字段名=值 WHERE 条件 $set = ' SET '; //对$data进行处理,取$data数组的键值 //array_keys(数组)方法获取数组中的键,返回一个新的数组 $key_arr = array_keys($data); foreach ($key_arr as $value){ //$set .= $value. ' =: '. $value. ', ';//此语句是错的,=:后面不能有空格 $set .= $value. ' =:'. $value. ', ';//点位符后不能有空格 } $set = rtrim($set,', '); $where = empty($where) ? '' : ' WHERE '. $where; $sql = 'UPDATE '. $this->table. $set. $where; //die(print_r($sql)); $stmt = $this->pdo->prepare($sql); //die(print_r($stmt)); if($stmt->execute($data)){ return $stmt->rowCount(); }else{ die('<pre>'.print_r($stmt->errorInfo(),true)); } } //删除数据 public function delete($where) { //删除数据SQL语句 DELETE FROM 表名 WHERE 条件 $sql = 'DELETE FROM '. $this->table. ' WHERE '. $where; $stmt = $this->pdo->prepare($sql); $stmt->execute(); } } //客户端代码 //-->Db类实例化, //自动连接数据库,需对不同表进行操作时仅修改$table即可 $dsn = 'mysql:host=html.io;dbname=phpsql'; //如果host省略相当于host=127.0.0.1 $user = 'root'; $password = 'root'; $table = 'staff'; $myDb =new Db($dsn,$user,$password,$table); //<--Db类实例化完成 //增加数据 //--->增加数据开始 //表单字段 //$fields=['name', 'age', 'sex', 'position', 'mobile', 'hiredate']; //需增加的数据 $data=[ 'name'=>'牛人', 'age'=>18, 'sex'=>1, 'position'=>'厕所所长', 'mobile'=>13888888888, 'hiredate'=>time() ]; //调用write方法增加数据 //$res_arr = $myDb->write($data,$fields); //echo '成功增加数据 '. $res_arr['count']. ' 条,staff_id: '. $res_arr['id']; //<---增加数据结束 //查询数据表 //--->查询开始 //$fields=['name', 'mobile']; $fields=''; $query_data = $myDb->read($fields); foreach ($query_data as $value){ print_r($value); echo '<br>'; } //<---查询结束 //更新数据 //--->更新开始 $data=[ 'age'=> 55, 'position'=>'小保姆' ]; //$where = "staff_id=11"; //$res_update=$myDb->update($data,$where); //echo '成功更新数据 '. $res_update. ' 条'; //<---更新完毕 //删除数据 $where = 'staff_id=12'; $myDb->delete($where);