Blogger Information
Blog 49
fans 0
comment 0
visits 38129
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php单例模式处理数据库增删改查初体验
超超多喝水
Original
632 people have browsed it

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

实例

<?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));//修改更新语句执行


运行实例 »

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


Correcting teacher:PHPzPHPz

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!