0

0

sqlserver2008及以上数据库操作封装类

php中文网

php中文网

发布时间:2016-06-06 19:34:58

|

1143人浏览过

|

来源于php中文网

原创

需要php_serv.dll支持,需要到微软官网下载 支持sqlserver2008(包括)以上版本 sqlserver2005以下就不需要尝试了,分页函数用法不支持的. 类比较简单,就不做演示了 http://www.du52.com/text.php?id=582 无 ?php/** * 数据库管理 * * @author wangaibo168@163.co

需要php_serv.dll支持,需要到微软官网下载
支持sqlserver2008(包括)以上版本
sqlserver2005以下就不需要尝试了,分页函数用法不支持的.
类比较简单,就不做演示了
http://www.du52.com/text.php?id=582

<?php
/**
 * 数据库管理
 *
 * @author wangaibo168@163.com
 * @charset utf-8
 */

class Db {

    /**
     * @var 数据库连接配置
     */
    private static $DbLink;

    /**
     * @var 数据库连接配置
     */
    private static $DbConfig;

    /**
     * @var 需要执行的SQL语句
     */
    private static $SqlStr;

    /**
     * @var 最后错误信息
     */
    private static $ErrorMsg;

    /**
     * 默认构造函数
     */
    private function __construct(){}

    /**
     * 配置连接参数
     * @param $opt
     */
    public static function configure($opt){
        if(!is_array($opt)) return;
        self::$DbConfig = $opt;
    }

    /**
     * 设置连接参数
     * @param $key
     * @param $value
     */
    public static function set($key,$value){
        if(empty($key)) return;
        if(!is_array(self::$DbConfig)) self::$DbConfig = array();
        self::$DbConfig[$key] = $value;
    }

    /**
     * 读取连接参数
     * @param $key
     * @return null
     */
    public static function get($key){
        if(!is_array(self::$DbConfig) || empty($key) || !array_key_exists($key,self::$DbConfig)) return null;
        return self::$DbConfig[$key];
    }

    /**
     * 数据库连接参数检查
     * @return bool
     */
    public static function check(){
        $host = self::get('host');
        if(empty($host)) return false;
        $port = self::get('port');
        if(!is_numeric($port) || $port<0 || $port>65535) return false;
        $username = self::get('username');
        if(empty($username)) return false;
        $database = self::get('database');
        if(empty($database)) return false;
        $charset = self::get('charset');
        if(empty($charset)) return false;
        return true;
    }

    /**
     * 连接初始化
     * @param bool $reconnect
     */
    public static function connect($reconnect=false){
        if(!$reconnect && is_resource(self::$DbLink)) return;
        self::close();
        if(!self::check()) die('Database Configuration Error');
        $opt = array('Database'=>self::get('database'),'CharacterSet'=>self::get('charset'),'UID'=>self::get('username'),'ReturnDatesAsStrings'=>true,'PWD'=>self::get('password'));
        self::$DbLink = sqlsrv_connect(self::get('host').','.self::get('port'),$opt);
        if(!is_resource(self::$DbLink)){
            $err = sqlsrv_errors();
            die('Database Connection Error('.$err[0]['message'].')');
        }
        // 测试连接是否可用
        /*
        $stmt = sqlsrv_query(self::$DbLink,'select 1 num');
        if(!is_resource($stmt)){
            $err = sqlsrv_errors();
            die('Database Query Error('.$err[0]['message'].')');
        }
        sqlsrv_free_stmt($stmt);
        */
    }

    /**
     * 查询SQL语句
     * @param $sql
     * @param array $params
     * @return array|bool
     */
    public static function executeQuery($sql,$params=array()){
        self::$SqlStr = $sql;
        self::$ErrorMsg = '';
        if(empty($sql)) return false;
        self::connect();
        if(!is_array($params)){
            $params = array();
        }
        $stmt = sqlsrv_query(self::$DbLink,self::$SqlStr,$params);
        if(!is_resource($stmt)){
            $err = sqlsrv_errors();
            self::$ErrorMsg = $err[0]['message'];
            return false;
        }
        $arr = explode(';',$sql);
        if(count($arr)>1){
            for($i=count($arr);$i>1;$i--){
                sqlsrv_next_result($stmt);
            }
        }
        $rows = array();
        while($row = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_ASSOC)){
            $rows[] = $row;
        }
        sqlsrv_free_stmt($stmt);
        return $rows;
    }

    /**
     * 查询SQL语句
     * @param $sql
     * @param array $params
     * @return bool|int
     */
    public static function executeCount($sql,$params=array()){
        self::$SqlStr = $sql;
        self::$ErrorMsg = '';
        if(empty($sql)) return false;
        self::connect();
        if(!is_array($params)){
            $params = array();
        }
        $stmt = sqlsrv_query(self::$DbLink,self::$SqlStr,$params);
        if(!is_resource($stmt)){
            $err = sqlsrv_errors();
            self::$ErrorMsg = $err[0]['message'];
            return false;
        }
        $row = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_NUMERIC);
        $count = 0;
        if(is_array($row) && count($row)==1){
            $count = intval($row[0]);
        }
        sqlsrv_free_stmt($stmt);
        return $count;
    }

    /**
     * 执行SQL语句
     * @param $sql
     * @param array $params
     * @return bool|int
     */
    public static function executeUpdate($sql,$params=array()){
        self::connect();
        self::$SqlStr = $sql;
        self::$ErrorMsg = '';
        if(empty($sql)) return false;
        self::connect();
        if(!is_array($params)){
            $params = array();
        }
        $stmt = sqlsrv_query(self::$DbLink,self::$SqlStr,$params);
        if(!is_resource($stmt)){
            $err = sqlsrv_errors();
            self::$ErrorMsg = $err[0]['message'];
            return false;
        }
        $num = sqlsrv_rows_affected($stmt);
        sqlsrv_free_stmt($stmt);
        return $num;
    }

    /**
     * 返回服务器信息
     * @return array
     */
    public static function serverInfo(){
        self::connect();
        return sqlsrv_server_info(self::$DbLink);
    }

    /**
     * 返回客户端信息
     * @return array|null
     */
    public static function clientInfo(){
        self::connect();
        return sqlsrv_client_info(self::$DbLink);
    }

    /**
     * 构建表SQL
     * @param $table
     * @return string
     */
    private static function tableSql($table){
        if(empty($table)) return '';
        if(is_array($table)){
            $arr = array();
            foreach($table as $k=>$v){
                $arr[] = '['.$v.'] '.$k;
            }
            $tableSql = implode(',',$arr);
        }else{
            $tableSql = '['.$table.']';
        }
        return $tableSql;
    }

    /**
     * 构建字段SQL
     * @param $field
     * @return string
     */
    private static function fieldSql($field){
        if(empty($field)) return '*';
        if(is_array($field)){
            $fieldSql = '['.implode('],[',$field).']';
        }else{

            $fieldSql = $field;
        }
        return $fieldSql;
    }

    /**
     * 构建条件SQL
     * @param $where
     * @return string
     */
    private static function whereSql($where){
        if(empty($where)) return '';
        $whereSql = ' where ';
        if(is_array($where)){
            $whereSql .= implode(' and ',$where);
        }else{
            $whereSql .= $where;
        }
        return $whereSql;
    }

    /**
     * 构建排序SQL
     * @param $order
     * @return string
     */
    private static function orderSql($order){
        if(empty($order)) return '';
        $orderSql = ' order by ';
        if(is_array($order)){
            $orderSql .= implode(',',$order);
        }else{
            $orderSql .= $order;
        }
        return $orderSql;
    }

    /**
     * 统计数据量
     * @param $table
     * @param $where
     * @param null $values
     * @return bool|int
     */
    public static function count($table,$where,$values=null){
        if(empty($table)) return false;
        $tableSql = self::tableSql($table);
        $whereSql = self::whereSql($where);
        self::$SqlStr = 'select count(*) from '.$tableSql.$whereSql;
        return self::executeCount(self::$SqlStr,$values);
    }

    /**
     * 添加数据
     * @param $table
     * @param $data
     * @return bool|int|string
     */
    public static function add($table,$data){
        if(empty($table) || !is_array($data) || count($data)==0) return false;
        self::connect();
        $fields = array();
        $values = array();
        $places = array();
        foreach($data as $key=>$value){ // 忽略以下划线开头的键
            if(stripos($key,'_')===0) continue;
            $fields[] = '['.$key.']';
            $values[] = $value;
            $places[] = '?';
        }
        self::$SqlStr = 'insert into ['.$table.']('.implode(',',$fields).')values('.implode(',',$places).')';
        $num = self::executeUpdate(self::$SqlStr,$values);
        return $num>0;
    }

    /**
     * 插入数据并获取最后插入数据的ID(自增长数据)
     * @param $table
     * @param $data
     * @return bool|int|string
     */
    public static function autoIdAdd($table,$data){
        if(empty($table) || !is_array($data) || count($data)==0) return false;
        self::connect();
        $fields = array();
        $values = array();
        $places = array();
        foreach($data as $key=>$value){ // 忽略以下划线开头的键
            if(stripos($key,'_')===0) continue;
            $fields[] = '['.$key.']';
            $values[] = $value;
            $places[] = '?';
        }
        self::$SqlStr = 'insert into ['.$table.']('.implode(',',$fields).')values('.implode(',',$places).');select top 1 SCOPE_IDENTITY() id';
        $rows = self::executeQuery(self::$SqlStr,$values);
        if(!is_array($rows) || count($rows)==0) return false;
        $id = $rows[0]['id'];
        if(!is_numeric($id)) return false;
        return $id;
    }

    /**
     * 更新数据
     * @param $table
     * @param $data
     * @param $where
     * @param null $value
     * @return bool
     */
    public static function update($table,$data,$where,$value=null){
        if(empty($table) || empty($where)) return false;
        self::connect();
        $whereSql = self::whereSql($where);
        $values = array();
        $places = array();
        foreach($data as $key=>$v){
            if(stripos($key,'_')===0) continue;
            $values[] = $v;
            $places[] = '['.$key.']=?';
        }
        foreach($value as $v){
            $values[] = $v;
        }
        self::$SqlStr = 'update ['.$table.'] set '.implode(',',$places).$whereSql;
        $num = self::executeUpdate(self::$SqlStr,$values);
        return $num>0;
    }

    /**
     * 删除数据
     * @param $table
     * @param $where
     * @param null $values
     * @return bool
     */
    public static function delete($table,$where,$values=null){
        if(empty($table) || empty($where)) return false;
        self::connect();
        $tableSql = self::tableSql($table);
        $whereSql = self::whereSql($where);
        self::$SqlStr = 'delete from '.$tableSql.$whereSql;
        $num = self::executeUpdate(self::$SqlStr,$values);
        return $num>0;
    }

    /**
     * 查询数据(全部)
     * @param $table
     * @param $field
     * @param $where
     * @param $order
     * @param null $values
     * @return array|bool
     */
    public static function fetchAll($table,$field,$where,$order,$values=null){
        if(empty($table)) return false;
        $tableSql = self::tableSql($table);
        $fieldSql = self::fieldSql($field);
        $whereSql = self::whereSql($where);
        $orderSql = self::orderSql($order);
        self::$SqlStr = 'select '.$fieldSql.' from '.$tableSql.$whereSql.$orderSql;
        $rows = self::executeQuery(self::$SqlStr,$values);
        return $rows;
    }

    /**
     * 查询数据(分页)
     * @param $table
     * @param $page
     * @param $size
     * @param $field
     * @param $where
     * @param $order
     * @param null $values
     * @return array|bool
     */
    public static function fetchPage($table,$page,$size,$field,$where,$order,$values=null){
        if(empty($table)) return false;
        $tableSql = self::tableSql($table);
        $fieldSql = self::fieldSql($field);
        $whereSql = self::whereSql($where);
        $orderSql = self::orderSql($order);
        $size = intval($size);
        if($size<=0) $size = 10;
        $start = ($page-1)*$size;
        if($start<0) $start = 0;
        $end = $start+$size;
        self::$SqlStr = 'select * from (select ROW_NUMBER()over(order by tempcolumn) temprownumber,* from (select top '.$end.' tempcolumn=0,'.$fieldSql.' from '.$tableSql.$whereSql.$orderSql.') temptable1) temptable2 where temprownumber>'.$start;
        $rows = self::executeQuery(self::$SqlStr,$values);
        return $rows;
    }

    /**
     * 查询数据(单条)
     * @param $table
     * @param $field
     * @param $where
     * @param $order
     * @param null $values
     * @return bool
     */
    public static function fetchOne($table,$field,$where,$order,$values=null){
        if(empty($table)) return false;
        $tableSql = self::tableSql($table);
        $fieldSql = self::fieldSql($field);
        $whereSql = self::whereSql($where);
        $orderSql = self::orderSql($order);
        self::$SqlStr = 'select top 1 '.$fieldSql.' from '.$tableSql.$whereSql.$orderSql;
        $rows = self::executeQuery(self::$SqlStr,$values);
        if(!is_array($rows) || count($rows)!=1) return false;
        return $rows[0];
    }

    /**
     * 获取单个字段数据
     * @param $table
     * @param $name
     * @param string $def
     * @param null $where
     * @param null $order
     * @param null $values
     * @return string
     */
    public static function fetchField($table,$name,$def='',$where=null,$order=null,$values=null){
        if(empty($name)) return $def;
        $data = self::fetchOne($table,$name,$where,$order,$values);
        if(!is_array($data)) return $def;
        return $data[$name];
    }

    /**
     * 获取最后插入的数据ID
     * @param $table
     * @return int|string
     */
    public static function lastId($table){
        $sql = 'select top 1 IDENT_CURRENT(\'['.$table.']\') id';
        $rows = self::executeQuery($sql);
        if(!is_array($rows) || count($rows)!=1) return -1;
        $id = $rows[0]['id'];
        if(!is_numeric($id)) return -1;
        return $id;
    }

    /**
     * 获取最后执行的SQL语句
     * @return mixed
     */
    public static function lastSql(){
        return self::$SqlStr;
    }

    /**
     * 获取错误
     * @return mixed
     */
    public static function lastError(){
        return self::$ErrorMsg;
    }

    /**
     * 获取连接字串
     * @return mixed
     */
    public static function getDb(){
        return self::$DbLink;
    }

    /**
     * 关闭连接
     */
    public static function close(){
        if(is_resource(self::$DbLink)) sqlsrv_close(self::$DbLink);
        self::$DbLink = null;
    }

}
?>

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

705

2026.02.13

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

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

233

2026.02.13

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

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

117

2026.02.13

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

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

22

2026.02.13

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

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

61

2026.02.13

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

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

30

2026.02.12

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

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

15

2026.02.12

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

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

669

2026.02.12

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

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

58

2026.02.12

热门下载

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

精品课程

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

共18课时 | 5.9万人学习

Rust 教程
Rust 教程

共28课时 | 6.1万人学习

Vue 教程
Vue 教程

共42课时 | 8.6万人学习

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

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