单例模式PDO

来源:互联网 发布:阿里备案域名交易 编辑:程序博客网 时间:2024/05/19 16:22

封装数据库操作类,通过PDO

单例模式PDO

1)调用单例模式切换数据库

2)获取一条/多条数据(注:可动态配置数组数据)

3)执行数据操作语句

4)返回插入的记录生成的ID编号



<?php

/**

 * 单例模式(三私一公)

 *     类名  MysqlPDO     类名

 * 私有属性 $instance    保存实例         (静态)

 * 私有方法 __clone      禁克隆

 * 私有构造 __construct  禁实例

 * 公有方法 getInstance  负责返回当前实例 (静态)

 */

class MysqlPDO

{

    private$host;       //服务器IP地址

    private$username;   //用户名

    private$password;   //密码

    private$port;       //端口号

    private$dbname;     //数据库

    private$charset;    //字符串

 

    /**

     * @varobject 保存PDO实例

     */

    private$pdo;

 

    /**

     * @varobject 保存当前类实例

     */

    privatestatic $instance;

 

    /**

     * 禁止克隆

     */

    privatefunction __clone()

    {

    }

 

    /**

     * 禁止实例化

     */

    privatefunction __construct($param)

    {

       $this->initParam($param);

       $this->initPDO();

    }

 

    /**

     * 参数初始化

     * @param$param 数据库信息

     */

    privatefunction initParam($param)

    {

       $this->host = isset($param['host']) ? $param['host'] : '127.0.0.1';

       $this->username = isset($param['username']) ? $param['username'] :'root';

       $this->password = isset($param['password']) ? $param['password'] :'';

       $this->port = isset($param['port']) ? $param['port'] : '3306';

       $this->dbname = isset($param['dbname']) ? $param['dbname'] : 'test';

       $this->charset = isset($param['charset']) ? $param['charset'] :'utf8';

    }

 

 

    /**

     * PDO初始化

     */

    privatefunction initPDO()

    {

        try {

           $dsn ="mysql:host={$this->host};dbname={$this->dbname};port={$this->port};charset={$this->charset}";

           $pdo = new PDO($dsn, $this->username, $this->password);

           $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

           $this->pdo = $pdo;

        }catch (PDOException $ex) {

           echo '获取错误信息:'.$ex->getMessage().'<br/>';

           echo '获取错误编码:'.$ex->getCode().'<br/>';

           echo '获取错误文件:'.$ex->getFile().'<br/>';

           echo '获取错误导致行:'.$ex->getLine().'<br/>';

        }

    }

 

    /**

     * 获取全部数据

     *@param  string $sql   SQL数据

     *@param  int    $type 返回数据格式

     *@return array

     */

    publicfunction fetchAll($sql, $type ='assoc')

    {

        $stmt= $this->pdo->query($sql);

       return $stmt->fetchAll($this->changeFetchType($type));

    }

 

    /**

     * 获取一条数据

     *@param  string $sql   SQL数据

     *@param  int    $type 返回数据格式

     *@return array

     */

    publicfunction fetch($sql, $type ='assoc')

    {

        $stmt= $this->pdo->query($sql);

       return $stmt->fetch($this->changeFetchType($type));

    }

 

    /**

     * 获取匹配常量

     */

    private function changeFetchType($type)

    {

        switch ($type) {

            case 'assoc':

                return PDO::FETCH_ASSOC;

                break;

            case 'num':

                return PDO::FETCH_NUM;

                break;

            case 'obj':

                return PDO::FETCH_OBJ;

                break;

            case 'both':

                return PDO::FETCH_BOTH;

                break;

            default:

                return PDO::FETCH_ASSOC;

                break;

        }

    }

 

    /**

     * 执行数据操作语句

     *@param  string $sql  SQL语句

     *@return int          返回当前受影响的行数,失败则返回false

     */

    publicfunction exec($sql)

    {

       return $this->pdo->exec($sql);

    }

 

    /**

     * 获取最近插入的自增ID

     *@return int

     */

    publicfunction lastInsertId()

    {

       return $this->pdo->lastInsertId();

    }

 

    /**

     * 负责返回当前实例

     *@return MysqlPDO|object

     */

    publicstatic function getInstance($param)

    {

        //如果当前对象时指定类的实例

        if(!self::$instance instanceof self) {

           self::$instance = new self($param);

        }

       return self::$instance;

    }

}

 

$param = array(

    'dbname'=> 'php9',

   'username' => 'root'

);

 

//调用单例模式

$obj = MysqlPDO::getInstance($param);

var_dump($obj);

 

//获取所有数据

$data = $obj->fetchAll("select * fromadmin", "num");

var_dump($data);

 

//插入数据

$state = $obj->exec("insert into adminvalues (null, 111, 33333)");

var_dump($state);

 

//获取自增ID

echo $obj->lastInsertId();


0 0
原创粉丝点击