`

数据库类

 
阅读更多
<?php
    /**
     * database.class.php    数据库类
     * ========================================
     * @Copyright	     (C) 2013  GCMS
     * @Author		     guhao
     * @Date		     13-4-18
     * ========================================
     * @Version              1.0
     */


    /**
     * Class database  用法
     * query($sql)    执行sql语句
     * create_db($db_name)  创建数据库
     * get_pk($tablename)   取主键
     * select($tablename,$fields="*",$where="",$order="",$limit="")  查询
     * insert($tablename,$data)  插入
     * update($tablename,$data,$where)  更新
     * delete($tablename,$where)  单个删除
     * del($tablename,$ids)  根据主键批量删除
     * mysql_server()   获取MySQL服务器信息
     */

class database {
    private $db_host;       //数据库主机
    private $db_user;       //数据库用户名
    private $db_pwd;        //数据库用户密码
    private $db_charset;    //数据路编码
    private $db_name;       //数据库名
    private $conn;          //数据库连接标识
    private $sql;           //数据库执行语句
    private $row;           //返回的条目数
    private $result;        //执行query命令的结果资源标识
    private $bulletin=true; //是否开启错误记录
    private $show_error=true;//显示所有错误,默认关闭
    private $is_error=false;//发现错误是否立即停止,不建议开启

    /**
     * 构造函数
     */
    public function __construct($db_host,$db_user,$db_pwd,$conn,$db_name,$db_charset){
        $this->db_host      = $db_host;
        $this->db_user      = $db_user;
        $this->db_pwd       = $db_pwd;
        $this->db_name      = $db_name;
        $this->db_charset   = $db_charset;
        $this->conn         = $conn;
        $this->connect();
        $this->select_db();
        $this->set_charset();
    }

    /**
     * 数据库连接
     */
    public function connect(){
        //判断是否为永久连接,true为永久连接,false为非永久连接
        if($this->conn=true){
            $this->conn = mysql_pconnect($this->db_host,$this->db_user,$this->db_pwd);
        }else{
            $this->conn = mysql_connect($this->db_host,$this->db_user,$this->db_pwd);
        }
    }
    /**
     * 选择数据库
     */
    public function select_db(){
        if(!mysql_select_db($this->db_name,$this->conn)){
            if($this->show_error){
                $this->show_error('数据库不可用:',$this->db_name);
            }
        }
    }

    /**
     * 数据库编码设置
     */
    public function set_charset(){
        $this->query("set names $this->db_charset");
    }


    /**
     * 数据库查询语句,可执行任何sql语句
     */
    public function query($sql){
        if($sql == ''){
            $this->show_error("SQL语句错误:","SQL语句不能为空!");
        }
        $this->sql=$sql;
        $result=mysql_query($this->sql,$this->conn);
        //如果不存在结果集进行调试
        if(!$result){
            //调试中使用,sql语句会自动打印出来
            if($this->show_error){
                $this->show_error("错误的SQL语句:","$this->sql");
            }
        }else{
            $this->result = $result;
        }
        return $this->result;
    }

    /**
     * 创建添加新的数据库
     */
    public function create_db($db_name){
        $db = $db_name;
        $sqlDB = "create database ".$db;
        $this->query($sqlDB);
    }


    /**
     * 以数组形式返回主机所有数据库名
     */
    public function arr_db(){
        //列出 MySQL 服务器中所有的数据库
        $rsPtr = mysql_list_dbs($this->conn);
        $i=0;
        //返回数据库的数目
        $cot=mysql_num_rows($rsPtr);
        while($i<$cot){
            $rs[]=mysql_db_name($rsPtr,$i);
            $i++;
        }
        return $rs;
    }


    /**
     * 取得记录集,获取数组-索引和关联
     */
    public function fetch_array($result){
        return mysql_fetch_array($result);
    }

    /**
     * 获取关联数组
     */
    public function fetch_assoc($result){
        return mysql_fetch_assoc($result);
    }

    /**
     * 获取数字索引数组
     */
    public function fetch_row($result){
        return mysql_fetch_row($result);
    }

    /**
     * 获取对象数组
     */
    public function fetch_object($result){
        return mysql_fetch_object($result);
    }

    /**
     * 取主键
     */
    public function get_pk($tablename){
        $sql="desc $tablename";//取得表结构
        $result=$this->query($sql);
        $pk='';
        while($row=$this->fetch_assoc($result)){
            if($row['Key']=='PRI'){
                $pk=$row['Field'];
                break;
            }
        }
        if($pk==''){
            return false;
        }else{
            mysql_free_result($result);
            return $pk;
        }
    }

    /**
     * 取表结构
     * return  array
     */
    public function get_field($tablename){
        $sql="desc $tablename";
        $result=$this->query($sql);
        $num=mysql_num_rows($result);
        if($num==0){
            return false;
        }
        $ret=array();
        while($row=$this->fetch_assoc($result)){
            $ret[]=$row[Fidld];
        }
        mysql_free_result($result);
        return $ret;
    }

    /**
     * 查询
     * $sql=select *(列名列表) from 表名 where $where order by $order  limit $limit
     */
    public function select($tablename,$fields="*",$where="",$order="",$limit=""){
        $sql="select $fields from $tablename ";
        if($where!=''){
            $sql.=" where $where ";
        }
        if($order!=''){
            $sql.=" order by $order ";
        }else{
            $pk=$this->get_pk($tablename);
            $sql.=" order by $pk desc ";
        }
        if($limit!=''){
            $sql.=" limit $limit ";
        }
        $result=$this->query($sql);
        $num=$this->fetch_row($result);
        if($num==0){
            if($this->show_error){
                $this->show_error("SQL语句错误:","暂时为空,没有任何内容");
            }
        }
        $ret=array();
        while($row=$this->fetch_assoc($result)){
            $ret[]=$row;
        }
        mysql_free_result($result);
        return $ret;
    }

    /**
     * 插入数据
     * $tablename  表名
     * $data    需要插入的数据
     * $fields  需要插入的字段名
     * $value_list  需要插入的值
     * return   bool
     */
    public function insert($tablename,$data){
        $sql="insert into $tablename ";
        /*$keys=array_keys($data);
        $fields=implode(',',$keys);
        $sql.=" ($fields) values ";*/
        $value_list='';
        $fields="";
        foreach($data as $key=>$value){
            $fields.=",'$key'";
            $value_list.=",'$value'";
        }
        $fields=substr($fields,1);
        $value_list=substr($value_list,1);
        $sql.=" ($fields) values ($value_list)";

        return $this->query($sql);
    }

    /**
     * 根据条件进行更新
     * $tablename   数据库表名
     * $data    需要修改的数据值
     * $where   修改的条件
     * return   bool
     */
    public function update($tablename,$data,$where){
        $uplist='';
        foreach($data as $key=>$value){
            $uplist.=",$key='$value'";
        }
        $uplist=substr($uplist,1);
        $sql="update $tablename set $uplist where $where";
        return $this->query($sql);
    }

    /**
     * 删除
     * $tablename   数据库表名
     * $where    删除数据的条件
     * return  bool
     */
    public function delete($tablename,$where){
        $sql="delete from $tablename where $where";
        return $this->query($sql);
    }

    /**
     * 根据主键批量删除
     * $tablename   数据库表名
     * $ids   需要删除的主键
     * $del_ids   需要删除的主键组成的字符串
     */
    public function del($tablename,$ids){
        //取主键
        $pk=$this->get_pk($tablename);
        if(!is_array($ids)){
            $sql="delete from $tablename where $pk=$ids";
        }else{
            $del_ids=implode(',',$ids);
            $sql="delete from $tablename where $pk in ($del_ids)";
        }
        return $this->query($sql);
    }

    /**
     * 释放结果集
     */
    public function free($result){
        @ mysql_free_result($result);
    }


    /**
     * 获取用户IP地址
     */
    public function getip() {
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else
            if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
                $ip = getenv("HTTP_X_FORWARDED_FOR");
            } else
                if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
                    $ip = getenv("REMOTE_ADDR");
                } else
                    if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
                        $ip = $_SERVER['REMOTE_ADDR'];
                    } else {
                        $ip = "unknown";
                    }
        return ($ip);
    }

    /**
     * 获取MySQL服务器信息
     */
    public function mysql_server($num = '') {
        switch ($num) {
            case 1 :
                return mysql_get_server_info(); //MySQL 服务器信息
                break;

            case 2 :
                return mysql_get_host_info(); //取得 MySQL 主机信息
                break;

            case 3 :
                return mysql_get_client_info(); //取得 MySQL 客户端信息
                break;

            case 4 :
                return mysql_get_proto_info(); //取得 MySQL 协议信息
                break;

            default :
                return mysql_get_client_info(); //默认取得mysql版本信息
        }
    }


    /**
     * 错误输出
     *
     */
    public function show_error($message = "", $sql = "") {
        if (!$sql) {
            echo "<font color='red'>" . $message . "</font>";
            echo "<br />";
        } else {
            echo "<fieldset>";
            echo "<legend>错误信息提示:</legend><br />";
            echo "<div style='font-size:14px; clear:both; font-family:Verdana, Arial, Helvetica, sans-serif;'>";
            echo "<div style='height:20px; background:#000000; border:1px #000000 solid'>";
            echo "<font color='white'>错误号:12142</font>";
            echo "</div><br />";
            echo "错误原因:" . mysql_error() . "<br /><br />";
            echo "<div style='height:20px; background:#FF0000; border:1px #FF0000 solid'>";
            echo "<font color='white'>" . $message . "</font>";
            echo "</div>";
            echo "<font color='red'><pre>" . $sql . "</pre></font>";
            $ip = $this->getip();
            if ($this->bulletin) {
                $time = date("Y-m-d H:i:s");
                $message = $message . "\r\n$this->sql" . "\r\n客户IP:$ip" . "\r\n时间 :$time" . "\r\n\r\n";

                $server_date = date("Y-m-d");
                $filename = $server_date . ".txt";
                $file_path = "error/" . $filename;
                $error_content = $message;
                //$error_content="错误的数据库,不可以链接";
                $file = "error"; //设置文件保存目录

                //建立文件夹
                if (!file_exists($file)) {
                    if (!mkdir($file, 0777)) {
                        //默认的 mode 是 0777,意味着最大可能的访问权
                        die("upload files directory does not exist and creation failed");
                    }
                }

                //建立txt日期文件
                if (!file_exists($file_path)) {

                    //echo "建立日期文件";
                    fopen($file_path, "w+");

                    //首先要确定文件存在并且可写
                    if (is_writable($file_path)) {
                        //使用添加模式打开$filename,文件指针将会在文件的开头
                        if (!$handle = fopen($file_path, 'a')) {
                            echo "不能打开文件 $filename";
                            exit;
                        }

                        //将$somecontent写入到我们打开的文件中。
                        if (!fwrite($handle, $error_content)) {
                            echo "不能写入到文件 $filename";
                            exit;
                        }

                        //echo "文件 $filename 写入成功";

                        echo "——错误记录被保存!";

                        //关闭文件
                        fclose($handle);
                    } else {
                        echo "文件 $filename 不可写";
                    }

                } else {
                    //首先要确定文件存在并且可写
                    if (is_writable($file_path)) {
                        //使用添加模式打开$filename,文件指针将会在文件的开头
                        if (!$handle = fopen($file_path, 'a')) {
                            echo "不能打开文件 $filename";
                            exit;
                        }

                        //将$somecontent写入到我们打开的文件中。
                        if (!fwrite($handle, $error_content)) {
                            echo "不能写入到文件 $filename";
                            exit;
                        }

                        //echo "文件 $filename 写入成功";
                        echo "——错误记录被保存!";

                        //关闭文件
                        fclose($handle);
                    } else {
                        echo "文件 $filename 不可写";
                    }
                }

            }
            echo "<br />";
            if ($this->is_error) {
                exit;
            }
        }
        echo "</div>";
        echo "</fieldset>";

        echo "<br />";
    }

    /**
     * 析构函数,自动关闭数据库,垃圾回收机制
     */
    public function __destruct(){
        if(!empty($this->result)){
            $this->free($this->result);
        }
        mysql_close($this->conn);
    }

    /**
     * 防止sql注入
     */
    public function inject_check($sql_str) {
        $check = eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);
        if ($check) {
            echo "输入非法注入内容!";
            exit ();
        } else {
            return $sql_str;
        }
    }
    //检查来路
    public function checkurl() {
        if (preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) !== preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])) {
            header("Location: http://www.dareng.com");
            exit();
        }
    }

}

 

分享到:
评论

相关推荐

    MFC中数据库类

    比较好用的数据库类 分享一下 1 ADOConn rar提供连接和查询数据库的类 2 在m pCon &gt;Open &quot;Provider Microsoft Jet OLEDB 4 0;Data Source D: UltrasicDatabase UltrasicDatabase mdb&quot; &quot;&quot; &...

    易语言ODBC数据库类模块源码

    易语言ODBC数据库类模块源码是一套专为易语言设计的用于访问ODBC数据源的编程工具。ODBC(Open Database Connectivity)是微软提供的一个数据库应用程序编程接口,它允许不同数据库系统之间的互操作性,使得程序员...

    php+mysql数据库类

    php 连接mysql 数据类 很好用的一个数据库类 包括getall() getone query 方法

    php 数据库类 对数据库进行多种操作 只需要简单的实例化对象 就可以实现强大的功能

    很好用的php数据库类 php 数据库类 对数据库进行多种操作 只需要简单的实例化对象 就可以实现强大的功能

    ASP 数据库类封装

    标题“ASP 数据库类封装”指的是一种优化的数据库处理方式,它不再依赖于传统的conn.asp文件,而是通过创建一个数据库类来封装数据库连接和操作。这种方式的优点在于提高了代码的可维护性和复用性,同时能更有效地...

    一个好用的php数据库类

    一个好用的php数据库类 $global_db = new MYDB('localhost', $dbuser['newsite']['writeuser'], $dbpw['newsite']['writeuser'], $dbname['newsite'], 0);

    数据工厂访问多种数据库类

    这些数据库类代表了不同的数据库管理系统(DBMS)和接口技术。 1. Oracle:Oracle是一种关系型数据库管理系统(RDBMS),由甲骨文公司提供,广泛应用于企业级应用。它的特点是高性能、高可用性和安全性。在编程中,...

    ODBC数据库类模块.rar

    这个“ODBC数据库类模块.rar”文件很可能包含了一组用易语言编写的类模块,用于简化ODBC数据库操作。 易语言是一种以中文为编程语句的编程环境,它的目标是使编程变得更加简单和易懂。在这个压缩包中,“易语言ODBC...

    C# 操作MySQL数据库类

    C# 操作MySQL数据库类 非存储过程操作类,如果要用到存储过程的话,自已修改里面的代码,里面的存储过程被我注释了。 至于调用方法,应该不用我说下载者应该也懂得吧,如果是对C#一巧不通的初学者,不懂也不要怪我...

    C# 操作MSSQL数据库类

    C# 操作MSSQL数据库类 非存储过程操作类,如果要用到存储过程的话,自已修改里面的代码,里面的存储过程被我注释了。 至于调用方法,应该不用我说下载者应该也懂得吧,如果是对C#一巧不通的初学者,不懂也不要怪我...

    .net 自动生成数据库类

    可将SQLServer 数据库自动生成C#的数据库模型类,非常好用哦。

    易语言-数据库类源码大全(259个).zip

    《易语言数据库类源码大全:深度解析与实践探索》 易语言,作为一款为中国用户设计的编程语言,以其简洁的语法和丰富的库函数,深受初学者和专业开发者喜爱。本资源包“易语言-数据库类源码大全(259个).zip”包含...

    仿Thinkphp的数据库类,超级好用,一个php文件

    通过PDO,这个仿Thinkphp的数据库类可以安全、高效地与数据库进行通信。 "带demo案例"意味着这个文件包含了一个或多个示例代码,用于演示如何使用这个数据库类。这通常是学习新库或类的一个快速方式,因为开发者...

    C#DBHelp访问数据库类

    在这个"C# DBHelp访问数据库类"中,我们关注的是一个自定义的DBHelp类,它可能是一个封装了数据库操作的工具类,旨在简化开发者对数据库的CRUD(创建、读取、更新、删除)操作。 1. **DBHelp类**:这个类可能是项目...

    在VC++中建立自定义数据库类

    在VC++中建立自定义数据库类的知识点主要包括以下几个方面: 1. VC++与数据库交互的基础知识:在VC++中,可以使用ODBC(Open Database Connectivity,开放式数据库互联)技术与数据库进行连接和操作。MFC...

    SQL数据库类 C#SQL数据库源码 C#SQL数据库源 SQL数据库访问 C#ACCESS数据库操作

    SQL数据库类 C#SQL数据库源码 C#SQL数据库源 SQL数据库访问 C#ACCESS数据库操作

    易语言数据库类组件的使用

    在易语言中,数据库类组件是用于处理数据库操作的重要工具,这些组件可以帮助开发者便捷地进行数据的读取、写入、修改和删除等操作。本篇文章将详细探讨易语言数据库类组件的使用方法。 首先,我们要了解易语言...

    sql.rar_qt sql_qt sql sever lin_qt 数据库_qt 数据库类

    总的来说,"sql.rar_qt sql_qt sql sever lin_qt 数据库_qt 数据库类"这个主题涵盖的是如何使用QT库在Linux环境下与SQL Server数据库进行交互,包括建立连接、执行SQL查询、管理数据以及利用QT的数据库类来构建应用...

    易语言源码数据库类.rar

    《易语言源码数据库类详解》 易语言是一种以“易”为理念,设计简洁、易学易用的编程语言,旨在降低编程门槛,让更多的人能够掌握编程技术。本资源"易语言源码数据库类.rar"是针对易语言中数据库操作的源代码类库,...

    葵花宝典-数据库类

    《葵花宝典-数据库类》是一份专为Java开发者准备的珍贵资料,它涵盖了数据库在Java编程中的重要应用和核心知识点。这份文档可能详细解析了如何在Java环境中操作和管理数据库,包括但不限于数据的增删改查、事务处理...

Global site tag (gtag.js) - Google Analytics