一、概念
接口: 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);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号