PHP之MySQL单例模式运用

封装MySQLDB单例_连接数据库

# 封装MySQL的单例
/*
 * 步骤:
 * 1.实现单例
 * 2.初始化参数
 * 3.连接数据库
 * 4.操作数据
 */
class MySQLConnection{
    private static $instance;
    private $host;//主机地址
    private $port;//端口号
    private $user;//用户名
    private $pwd;//密码
    private $dbname;//数据库名
    private $charset;//字符集
    private $link;//连接对象

    private function __construct($parma)
    {
        $this->initParma($parma);
        $this->initconnection();
    }
    private function __clone()
    {
    }
    public static function getInstance($parma=array()){
        if (!self::$instance instanceof self){
            self::$instance = new self($parma);
        }
        return self::$instance;
    }
    //初始化参数
    private function initParma($parma){
        $this->host=$parma['host']??'127.0.0.1';
        $this->port=$parma['port']??'3306';
        $this->user=$parma['user']??'';
        $this->pwd=$parma['pwd']??'';
        $this->dbname=$parma['dbname']??'';
        $this->charset=$parma['charset']??'utf8';
    }
    private function initconnection(){
        $this->link=mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname,$this->port);
        if(mysqli_connect_error()){
            echo '数据库连接失败<br>';
            echo '错误信息:'.mysqli_connect_error().'<br>';
            echo '错误编码:'.mysqli_connect_errno().'<br>';
            exit();
        }
        mysqli_set_charset($this->link,$this->charset);
    }
    //执行数据库的增删改查
    private function excute($sql){
        if (!$rs=mysqli_query($this->link,$sql)){
            echo 'SQL语句执行失败'.'<br>';
            echo '错误信息:'.mysqli_error($this->link).'<br>';
            echo '错误编号:'.mysqli_errno($this->link).'<br>';
            echo '错误SQL语句:'.$sql.'<br>';
        }
        return $rs;
    }
    //执行增删改
    /*
     * 执行成功返回true,失败返回false
     */
    public function exec($sql){
        $key = substr($sql,0,6);
        if (in_array($key,array('insert','update','delete')))
            return $this->excute($sql);
        else{
            echo '非法访问<br>';
            exit();
        }
    }
    //获取自动增长的编号
    public function getLastInsertId(){
        return mysqli_insert_id($this->link);
    }
    //执行查询语句
    private function query($sql){
        if (substr($sql,0,6)=='select'||substr($sql,0,4)=='show'||substr($sql,0,4)=='desc'){

            return $this->excute($sql);
        }else{
            return '非法访问<br>';
        }
    }
    private function getType($type){
        switch ($type){
            case 'num':
                return MYSQLI_NUM;
            case 'both':
                return MYSQLI_BOTH;
            default:
                return MYSQLI_ASSOC;
        }
    }
    //执行查询语句,返回二维数组
    public function fetchAll($sql,$type='assoc'){
        //可以这样写return mysqli_fetch_all($this->query($sql),$this->getType($type));
        $rs = $this->query($sql);
        $type = $this->getType($type);
        return mysqli_fetch_all($rs,$type);
    }
    //执行匹配语句返回一维数组
    public function fetchRow($sql,$type='assoc'){
        $list = $this->fetchAll($sql,$type);
        if (!empty($list)){
            return $list[0];//返回的是一行数据
        }
        return array();
    }
    //匹配一行一列
    public function fetchColumns($sql){
        $list = $this->fetchAll($sql,'num');
        if (!empty($list)){
            return $list[0][0];//返回的是一行一列数据的结果
        }
        return null;
    }

}
$parma = array(
    'host'=>'127.0.0.1',
    'user'=>'你的数据库用户名',
    'pwd'=>'你的数据库密码',
    'port'=>'数据库所开的端口号',
    'dbname'=>'数据库名'
);
$db = MySQLConnection::getinstance($parma);
$er = $db->fetchAll('select * from user');
$row = $db->fetchRow('select * from user where id=2');
$column = $db->fetchColumns('select name from user where id=2');
echo '<br>';
echo $column;
echo '<pre>';
print_r($row);
echo '<pre>';
print_r($er);
注意:在实际过程中一定要把错误语句出现在浏览器上一定要是一样的,
或者出现错误跳到指定页面,这样会减少一些攻击。只要有错误信息提示,就会给黑客很大的利用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值