数据库类

<?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();
        }
    }

}

 

你可能感兴趣的:(数据库)