博主信息
超超多喝水
博文
31
粉丝
0
评论
0
访问量
2232
积分:0
P豆:62

php单例模式处理数据库增删改查初体验

2021年08月16日 18:20:19阅读数:83博客 / 超超多喝水/ PHP学习

通过单例模式链接数据库,保证实例化只发生一次,可以减轻服务器负载。

实例

<?php

//单例模式链接数据

interface iDbBase
{
    //数据库操作 curd
    static function insert($db,$data);
    static function select($db,$where=[]);
    static function delete($db,$where=[]);
    static function update($db,$data,$where=[]);
    static function doConnect($dsn,$username,$password);

}

abstract class aDb implements iDbBase
{
    //创建类的唯一实例 pdo对象
    private static $_instance;

    //阻止此类在外部实例化
    private function __construct()
    {
    }
    // 阻止此类在外部克隆
    private function __clone()
    {
    }
    //声明连接数据库的静态方法
    static function doConnect($dsn,$username,$password)
    {
            //判断是否已实例化,未实例化进行实例化,否则返回实例
        if(is_null(self::$_instance))
        {
        //得到PDO连接对象 储存在$_instance
        self::$_instance = new PDO($dsn,$username,$password);//抽象类不能被实例化 这里可以实例化系统类PDO
        }
        return self::$_instance;
    }
}
//工作类
class Db extends aDb
{
    //数据库操作 增加插入
    static function insert($db,$data)
    {
            //创建两个空字符串存储数据
        $str1 = '';
        $str2 = '';
        //遍历数据数组,并拼接为sql语句识别的部分内容
        foreach($data as $k=>$v)
        {
                //进一步判断$data是否是数组,如果是则执行拼接
                if(is_array($data))
                        {
                $str1 .= "`".$k."`,";
                $str2 .= "'".$v."',";
             }
        }
        //去掉最后一位产生的","
        $str1 = substr($str1,0,strlen($str1)-1);
        $str2 = substr($str2,0,strlen($str2)-1);
        //使用PDO::exec()执行sql语句并返回影响行数,并在内部对sql语句进行正确拼接
        return $db->exec("INSERT INTO `id_list` ($str1) VALUES ($str2)");
    }
    //数据库操作 查询
    static function select($db,$where=['id'=>1,'age'=>18])
    {
            //声明一个空字符串
        $str = '';
        //遍历查询数组,并拼接为sql语句识别的部分内容
        foreach($where as $k=>$v)
        {
                //进一步判断$where是否是数组,如果是则执行拼接
            if(is_array($where))
            {
                    //判断$where是否只有多对数组,如果有末尾加上"and",否则不加
                if(count($where)>1)
                {
                    $str .= $k . ' = ' . $v . ' and ';
                }else{
                    $str .= $k . ' = ' . $v;
                    }
            }
        }
        //判断$where是否只有多对数组,如果是则对上面处理的拼接做进一步处理,将末尾多出的and去掉
        if(count($where)>1)
        {
            $str = substr($str,0,strlen($str)-4);
        }
        //query方法 fetchALL(PDO::FETCH_ASSOC)取关联数组 以取结果集的形式去取
        return $db->query("SELECT `id`,`username`,`password` FROM `id_list` WHERE $str")->fetchALL(PDO::FETCH_ASSOC);
    }
    //数据库操作 删除
    static function delete($db,$where=['id'=>2])
    {
                //声明一个空字符串
        $str = '';
        //遍历查询数组,并拼接为sql语句识别的部分内容
        foreach($where as $k=>$v)
        {
                //进一步判断$where是否是数组,如果是则执行拼接
            if(is_array($where))
            {
                    //判断$where是否只有多对数组,如果有末尾加上"and",否则不加
                if(count($where)>1)
                {
                    $str .= $k . ' = ' . $v . ' and ';
                }else{
                    $str .= $k . ' = ' . $v;
                    }
            }
        }
        //判断$where是否只有多对数组,如果是则对上面处理的拼接做进一步处理,将末尾多出的and去掉
        if(count($where)>1)
        {
            $str = substr($str,0,strlen($str)-4);
        }
        //使用PDO::exec()执行sql语句并返回影响行数,并在内部对sql语句进行正确拼接
        return $db->exec("DELETE FROM `id_list` WHERE `id_list`.$str");
    }
    //数据库操作 修改数据库数据信息
    static function update($db,$data,$where=['id'=>6])
    {
                //创建两个空字符串存储数据
        $str = '';
        $str1 = '';
        //遍历数据数组,并拼接为sql语句识别的部分内容
        foreach($data as $k=>$v)
        {
                //进一步判断$data是否是数组,如果是则执行拼接
                if(is_array($data))
                {
                     $str1 .= "`".$k."`='".$v."',";
                }
            
        }
        //去掉最后一位产生的","
        $str1 = substr($str1,0,strlen($str1)-1);
        //变量查询数组,并拼接为sql语句识别的部分内容
        foreach($where as $k=>$v)
        {
                //进一步判断$where是否是数组,如果是则执行拼接
            if(is_array($where))
            {
                    //判断$where是否只有多对数组,如果有末尾加上"and",否则不加
                if(count($where)>1)
                {
                    $str .= $k . ' = ' . $v . ' and ';
                }else{
                    $str .= $k . ' = ' . $v;
                    }
            }
        }
        //判断$where是否只有多对数组,如果是则对上面处理的拼接做进一步处理,将末尾多出的and去掉
        if(count($where)>1)
        {
            $str = substr($str,0,strlen($str)-4);
        }
        //使用PDO::exec()执行sql语句并返回影响行数,并在内部对sql语句进行正确拼接
        return $db->exec("UPDATE `id_list` SET $str1 WHERE `id_list`.$str");
    }

}


//客户端代码

$dsn ='mysql:host=localhost;dbname=test';//数据库链接信息
$db = Db::doConnect($dsn,'root','');//登录数据库账号密码
// $data = ['id'=>5,'username'=>'admin5','password'=>'admin7890','age'=>16];//新增插入测试数据
$data = ['id'=>2,'username'=>'admin2','password'=>'admin456','age'=>18];//修改测试数据
// print_r(Db::select($db));//查询语句执行
// echo (Db::insert($db,$data));//插入语句执行
// echo (Db::delete($db));//删除语句执行
echo (Db::update($db,$data));//修改更新语句执行


运行实例 »

点击 "运行实例" 按钮查看在线实例


批改老师:PHPzhongPHPzhong

批改状态:合格

老师批语:

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论