0

0

PHP有用的MYSQL操作类(设计模式解读一)_PHP教程

php中文网

php中文网

发布时间:2016-07-13 17:51:46

|

981人浏览过

|

来源于php中文网

原创

要用php操作一个数据库很简单,相应入门后的phper都可以做到,但是在应对大量的表操作时,我们为许多的mysql语句感到厌烦,所以我们急切想要把大量数据库操作封装起来。所以就出现了数据库对象映射。

首先我们新建一个接口。

singleton.class.php
[php]
/**
 * @author tomyjohn
 * @link
 * @license
 * @version 1.0
 * @copyright Copyright 2010 tomyjohn - tomyjohn.gicp.net
 * @package singleton
 */ 
/**
 * 数据库对象
 */ 
interface singleton{ 
     
    /**
     * 生成数据库对象
     * @returns object data object;
     * @access public 
     */ 
    public static function getInstance(); 

再新建一个抽象类,这个抽象类把所有的数据库都简明地用5个方法来抽象。
db.class.php
[php]
/**
 * @author tomyjohn
 * @link
 * @license
 * @version 1.0
 * @copyright Copyright 2010 tomyjohn - tomyjohn.gicp.net
 * @package db
 */ 
/**
 *抽象DB类
 */ 
abstract class db{ 
     
    /**
     * 工厂模式
     * @param string $type sql type 
     * @returns object 
     * @access public 
     */ 
    public static function factory($type){ 
        return call_user_func(array($type,'getInstance')); 
    } 
    /**
     * 执行SQL语句
     * @param string $query sql 语句
     * @return object resource or false;
     * @access public
     */ 
    abstract public function execute($query); 
    /**
     * 获取SQL语句返回的数组
     * @param string $query sql 语句
     * @return object resource or false;
     * @access public
     */ 
    abstract public function get_array($query); 
    /**
     * 获取上一条语句的执行ID
     * @param string $query sql 语句
     * @return integer number or false;
     * @access public
     */ 
    abstract public function insert_get_id($query); 
    /**
     * 转化特殊字符
     * @param string $string 
     * @return string 处理后的字符串
     * @access public
     */ 
    abstract public function clean($string); 

相信看到这里,都会想到那个call_user_func方法该如何使用,别急,往下看
mysql.class.php
[html]
/** 
 * @author tomyjohn 
 * @link 
 * @license 
 * @version 1.0 
 * @copyright Copyright 2010 tomyjohn - tomyjohn.gicp.net 
 * @package db 
 */ 
/** 
 *MYSQL数据库对象 
 */ 
class mysql extends db implements singleton{ 
     
    /** 
     * @var $instance object  
     * @access current class 
     */ 
    protected static $instance = null; 
    /** 
     * @var $link resource 
     * @access current class 
     */ 
    protected $link; 
     
    /** 
     * 数据库实例 
     * @return  $self::instance object 
     */ 
    public static function getInstance(){ 
        if(is_null(self::$instance)){ 
            self::$instance = new self(); 
        } 
        return self::$instance; 
    } 
     
    /** 
     * 构造器 
     */ 
    protected function __construct(){ 
        global $current_conf; 
        $user = $current_conf['DBUSER']; 
        $pass = $current_conf['DBPWD']; 
        $host = $current_conf['DBHOST']; 
        $db   = $current_conf['DBNAME']; 
         
        $this->link = mysql_connect($host,$user,$pass); 
         
        mysql_set_charset($current_conf['DBCHARSET'] , $this->link); 
        mysql_select_db($db); 
    } 
     
    /** 
     * 转化特殊字符 
     * @param string $string  
     * @return string 处理后的字符串 
     * @access public 
     */ 
    public function clean($string){ 
        return mysql_real_escape_string($string,$this->link); 
    } 
     
    /** 
     * 执行SQL语句 
     * @param string $query sql 语句 
     * @return object resource or false; 
     * @access public 
     */ 
    public function execute($query){ 
        return mysql_query($query,$this->link); 
    } 
    /** 
     * 获取上一条语句的执行ID 
     * @param string $query sql 语句 
     * @return integer number or false; 
     * @access public 
     */ 
    public function insert_get_id($query){ 
        $this->execute($query); 
        return mysql_insert_id($this->link); 
    } 
    /** 
     * 获取SQL语句返回的数组 
     * @param string $query sql 语句 
     * @return object resource or false; 
     * @access public 
     */ 
    public function get_array($query){ 
        $result = $this->execute($query); 
        $return = array(); 
        if($result){ 
            while($row = mysql_fetch_array($result , MYSQL_ASSOC)){ 
                $return[] =$row; 
            } 
        } 
        return $return; 
    } 

current_conf 这个数组是我项目里的,其实也可以用你数据库的用户名和密码代替,看完这个我想你们也应该清楚了,继承DB然后实现singleton接口后的这个类,其实也可用到MSSQL,ORACL,以及其他数据库,但是光有这个,我们只能使操作数据库变成这样

[html] view plaincopy
$connection = db::factory('mysql'); 
$sql = "SELECT * FROM table"; 
$value_array = $connection->get_array($sql); 
[html] view plaincopy
print_r($value_array); 
这样虽然解决了扩展,解决了一些重复的操作,但是还不是很方便,我们应该更进一步,使数据库表用对象表示,即数据库映射

dao.class.php

[html]
class dao{ 
    /** 
     * @var $values array 存放数据库对象  
     * @access current class 
     */ 
    protected $values = array(); 
     
    /** 
     * @var $suffix array 存放数据库对象  
     * @access public  
     */ 
    public $suffix = ''; 
     
    /** 
     * 构造器 
     */ 
    public function __construct($qualifier = null){ 
        global $current_conf; 
        $this->suffix = $current_conf['DBSUFFIX']; 
         
        if(!is_null($qualifier)){ 
            $conditional = array(); 
             
            if(is_numeric($qualifier)){ 
                $conditional = array('id'=>$qualifier); 
            } 
            else if(is_array($qualifier)){ 
                $conditional = $qualifier; 
            } 
            else{ 
                throw new Exception('Invalid type of qualifier given!'); 
            } 
             
            $this->populate($conditional); 
        }        
    } 
     
    public function __set($name , $value){ 
        $this->values[$name] = $value; 
    } 
     
    public function __get($name){ 
        if(isset($this->values[$name])){ 
            return $this->values[$name]; 
        } 
        else{ 
            return null; 
        } 
    } 
     
    /** 
     * 解析实例的参数  
     * @param $conditional obj  
     */ 
    protected function populate($conditional){ 
        $connection = db::factory('mysql'); 
         
        $sql = "SELECT * FROM {$this->suffix}{$this->table} WHERE "; 
        $qualifier = ''; 
         
        foreach($conditional as $column => $value){ 
            if(!empty($qualifier)){ 
                $qualifier .= ' AND '; 
            } 
            $qualifier .= "`{$column}`='" . $connection->clean($value) . "' "; 
        } 
         
        $sql .= $qualifier; 
        $value_array = $connection->get_array($sql); 
         
        if(!isset($value_array[0])){ 
            $value_array[0] = array(); 
        } 
         
        foreach($value_array[0] as $key => $value){ 
            $this->values[$key] = $value; 
        } 
    } 
     
    /** 
     * 保存数据 
     */ 
    public function save(){ 
        if(!$this->id){ 
            $this->create(); 
        } 
        else{ 
            return $this->update(); 
        } 
    } 
     
    /** 
     * 添加数据  www.2cto.com
     */ 
    public function create(){ 
        $connection = db::factory('mysql'); 
         
        $sql = "INSERT INTO {$this->suffix}{$this->table}(`"; 
        $sql .= implode('`, `' , array_keys($this->values)); 
        $sql .="`) VALUES('"; 
         
        $clean = array(); 
        foreach($this->values as $value){ 
            $clean[] = $connection->clean($value); 
        } 
         
        $sql .= implode("', '" , $clean); 
        $sql .="')"; 
         
        $this->id = $connection->insert_get_id($sql); 
    } 
     
    /** 
     * 更新数据 
     * @return 返回执行操作的结果 
     */ 
    public function update(){ 
        $connection = db::factory('mysql'); 
         
        $sql = "UPDATE {$this->suffix}{$this->table} set "; 
         
        $updates = array(); 
        foreach($this->values as $key=>$value){ 
            if($key!='id'){ 
                $updates[] = "`{$key}`='" . $connection->clean($value) . "'"; 
            } 
        } 
         
        $sql .= implode(',' , $updates); 
        $sql .= " WHERE id={$this->id}"; 
         
        return $connection->execute($sql); 
    } 
    /** 
     * 删除数据 
     * @return 返回执行操作的结果 
     */ 
    public function delete(){ 
        $connection = db::factory('mysql'); 
         
        $sql = "DELETE FROM {$this->suffix}{$this->table} WHERE "; 
        $qualifier = 'id='.$this->id; 
 
        $sql .= $qualifier; 
        return $connection->execute($sql); 
    } 
     
    /** 
     * 对象转成数组 
     * @return array 
     */ 
    public function object_to_array(){ 
        return $this->values; 
    } 
     

如果看到这里,我相信大家都会想去继承这个类。 是的,如果继承了这个类,那么每条记录就可以变成对象,就可以用面向对象的方式去处理了。

UQ云商B2B2C系统
UQ云商B2B2C系统

UQCMS云商是一款B2B2C电子商务软件 ,非常适合初创的创业者,个人及中小型企业。程序采用PHP+MYSQL,模板采用smarty模板,二次开发,简单方便,无需学习其他框架就可以自行模板设计。永久免费使用,操作简单,安全稳定。支持PC+WAP+微信三种浏览方式,支持微信公众号。

下载

立即学习PHP免费学习笔记(深入)”;

我写一个

news.dao.class


class news extends dao{ 
    protected $table = __CLASS__; 
     


作者:tomyjohn

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478158.htmlTechArticle要用PHP操作一个数据库很简单,相应入门后的PHPER都可以做到,但是在应对大量的表操作时,我们为许多的MYSQL语句感到厌烦,所以我们急切...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号