Blogger Information
Blog 17
fans 0
comment 0
visits 12038
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1009接口实现数据库操作
ShunPro的博客
Original
541 people have browsed it

一、概念

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


Correction status:qualified

Teacher's comments://--->直接写入字段列表和值列表方式,当数据表变动时需修改此方法 以后, 注释不要这样写了, 行业规范还是要遵守一下, 毕竟代码有可能是给别人看的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post