博客列表 >1009接口实现数据库操作

1009接口实现数据库操作

ShunPro的博客
ShunPro的博客原创
2019年10月11日 23:08:43543浏览

一、概念

接口: 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);


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议