mysql操作类库--摘抄

<!--?php

/**
  +----------------------------------
 * MySQL操作类库
  +----------------------------------
 * @author    马犇 <www.imaben.com-->
  +----------------------------------
 * @version   1.2 (2013-5-31)
  +----------------------------------
 */

include (dirname(__FILE__) . DIRECTORY_SEPARATOR . ‘config.php‘);

define(‘CLIENT_MULTI_RESULTS‘, 131072);

class mysql {

    /* 主机地址 */

    private $Host = ‘127.0.0.1‘;

     /* 数据库名称 */
    private $dbName = DB_NAME;

    /* 用户名 */
    private $UserName = DB_USER;

    /* 连接密码 */
    private $Password = DB_PWD;

    /* 数据库编码 */
    private $dbCharSet = ‘utf8‘;

    /* 错误信息 */
    private $errorMsg;

    /* 最后一次执行的SQL */
    private $lastSql;

    /* 字段信息 */
    private $fields = array();

    /* 最后一次插入的ID */
    public $lastInsID = null;

    /* 数据库连接ID */
    private $linkID = 0;

    /* 当前查询ID */
    private $queryID = null;
    
    /*主键*/
    private $pk = null;

    public function __construct($DBName = ‘‘) {
        if ($DBName != ‘‘)
            $this->dbName = $DBName;
        $this->connect();
    }

    /**
      +----------------------------------------------------------
     * 连接数据库方法
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function connect() {

        if ($this->linkID == 0) {
            $this->linkID = mysql_connect($this->Host, $this->UserName, $this->Password, true, CLIENT_MULTI_RESULTS);
            if (!$this->linkID) {
                $this->errorMsg = ‘数据库连接错误\r\n‘ . mysql_error();
                $this->halt();
            }
        }
        if (!mysql_select_db($this->dbName, $this->linkID)) {
            $this->errorMsg = ‘打开数据库失败‘ . mysql_error($this->linkID);
            $this->halt(‘打开数据库失败‘);
        }
        $dbVersion = mysql_get_server_info($this->linkID);
        if ($dbVersion >= "4.1") {
            //使用UTF8存取数据库 需要mysql 4.1.0以上支持
            mysql_query("SET NAMES ‘" . $this->dbCharSet . "‘", $this->linkID);
        }
        //设置CharSet
        mysql_query(‘set character set \‘‘ . $this->dbCharSet . ‘\‘‘, $this->linkID);
        //设置 sql_model
        if ($dbVersion > ‘5.0.1‘) {
            mysql_query("SET sql_mode=‘‘", $this->linkID);
        }
    }

    /**
      +----------------------------------------------------------
     * 释放查询结果
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function free() {
        if($this->queryID != null)
            mysql_free_result($this->queryID);
        $this->queryID = null;
    }

    /**
      +----------------------------------------------------------
     * 执行语句
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $sql  sql指令
      +----------------------------------------------------------
     * @return bool or resource
      +----------------------------------------------------------
     */
    public function execute($sql) {

        if ($this->linkID == 0)
            $this->connect();
        $this->lastSql = $sql;
        $this->queryID = mysql_query($sql);
        if (false == $this->queryID) {
            $this->errorMsg = ‘SQL语句执行失败\r\n‘ . mysql_error($this->linkID);
            return false;
        } else {
            return $this->queryID;
        }
    }

    /**
      +----------------------------------------------------------
     * 获取记录集的行数
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $sql  sql指令 可为空
     * 如为空:返回上一结果集记录数
     * 如不为空:返回当前sql语句的记录数 
      +----------------------------------------------------------
     * @return integer
      +----------------------------------------------------------
     */
    public function getRowsNum($sql = ‘‘) {

        if ($this->linkID == 0) {
            $this->connect();
        }
        if ($sql != ‘‘) {
            $this->execute($sql);
        }
        return mysql_num_rows($this->queryID);
    }

    /**
      +----------------------------------------------------------
     * 表单数据直接插入到数据表中
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $tableName 数据表名
      +----------------------------------------------------------
     * @return 执行成功返回插入记录的索引记录,失败返回false
      +----------------------------------------------------------
     */
    public function form2db($tableName) {

        $_POST["add_time"] = date(‘Y-m-d H:i:s‘);
        $data = $_POST;
        $this->fields = $this->getFields($tableName);
        $data = $this->_facade($data);
        if ($this->insert($tableName, $data)) {
            return $this->lastInsID;
        } else {
            return false;
        }
    }

    /**
      +----------------------------------------------------------
     * 数据直接插入到数据表中
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $tableName 数据表名
      +----------------------------------------------------------
     * @param array $data 插入的数据 数据键名对应字段名,键值对应值
      +----------------------------------------------------------
     * @return boolean
      +----------------------------------------------------------
     */
    public function insert($tableName, $data) {

        $values = $fields = array();
        foreach ($data as $key => $val) {
            $value = ‘\‘‘ . addslashes($val) . ‘\‘‘;
            if (is_scalar($value)) { // 过滤非标量数据
                $values[] = $value;
                $fields[] = $key;
            }
        }
        $sql = ‘INSERT INTO ‘ . trim($tableName) . ‘(‘ . implode(‘,‘, $fields) . ‘) VALUES(‘ . implode(‘,‘, $values) . ‘)‘;
        if ($this->execute($sql)) {
            $this->errorMsg = ‘插入失败\r\n‘ . mysql_error($this->linkID);
            $this->lastInsID = mysql_insert_id($this->linkID);
            return true;
        } else {
            return false;
        }
    }

    /**
      +----------------------------------------------------------
     * 更新操作
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $tableName 数据表名
      +----------------------------------------------------------
     * @param array $data 插入的数据 数据键名对应字段名,键值对应值
      +----------------------------------------------------------
     * @param array $condition 更新条件,为安全起见,不能为空
      +----------------------------------------------------------
     * @param array $isForm 可为空,缺省为true
     * 如果为true,会当成表单更新数据表来处理,自动映射字段
     * 如果为false,会当成普通的更新来处理,不会自动映射字段
      +----------------------------------------------------------
     * @return boolean
      +----------------------------------------------------------
     */
    public function update($tableName, $data, $condition, $isForm = true) {

        if (empty($condition)) {
            $this->errorMsg = ‘没有设置更新条件‘;
            return false;
        }
        //处理分解condition
        if(is_array($condition)){
            $condition = self::_parseCondition($condition);
        }
        if ($isForm) {
            $this->fields = $this->getFields($tableName);
            $data = $this->_facade($data);
        }
        $sql = ‘UPDATE ‘ . trim($tableName) . ‘ SET ‘;
        foreach ($data as $key => $val) {
            $sql .= $key . ‘=\‘‘ . $val . ‘\‘,‘;
        }
        $sql = substr($sql, 0, strlen($sql) - 1);
        $sql .= ‘ WHERE ‘ . $condition;
        if ($this->execute($sql)) {
            return true;
        } else {
            $this->errorMsg = ‘更新失败\r\n‘ . mysql_error($this->linkID);
            return false;
        }
    }

    /**
      +----------------------------------------------------------
     *  删除操作
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $tableName 数据表名
      +----------------------------------------------------------
     * @param array $condition 更新条件,为安全起见,不能为空
      +----------------------------------------------------------
     * @return boolean
      +----------------------------------------------------------
     */
    public function delete($tableName, $condition) {
        //处理分解condition
        if(is_array($condition)){
            $condition = self::_parseCondition($condition);
        }
        $sql = ‘delete from ‘ . $tableName . ‘ where 1=1 and ‘ . $condition;
        if (!$this->execute($sql))
            return false;
        return true;
    }
    
    /**
     +----------------------------------------------------------
     * 利用__call魔术方法实现一些特殊的Model方法
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $method 方法名称
     * @param array $args 调用参数
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    public function __call($method,$args){
        
        /*根据某个字段获取记录字段的值
         * 例1:getFieldByid(student_info,100,name)---获取学生表中id为100的学生姓名
         * 例2:getFieldByxh(student_info,201215030223,address)---获取学生表中学号为201015030223的地址
         * 注:"getFieldBy"不区分大小写,后面的字段名区分大小写
         * 返回值:string
         */
        if(strtolower(substr($method,0,10)) == ‘getfieldby‘){
            $name = substr($method,10);
            $sql = ‘select `‘.$args[2].‘` from ‘.$args[0].‘ where ‘.$name.‘=\‘‘.$args[1].‘\‘‘;
            if($this->execute($sql)){
                $row = mysql_fetch_array($this->queryID);
                return $row[0];
            }else{
                return false;
            }
        }
         /*根据某个字段和值获取某条记录
         * 例1:getByid(student_info,100)---获取学生表中id为100的学生信息
         * 例2:getByxh(student_info,201215030223)---获取学生表中学号为201015030223的学生信息
         * 注:"getBy"不区分大小写,后面的字段名区分大小写
         * 返回值:array
         */
        elseif(strtolower(substr($method,0,5)) == ‘getby‘){
            $ret = array();
            $name = substr($method,5);
            $sql = ‘select * from ‘.$args[0].‘ where ‘.$name.‘=\‘‘.$args[1].‘\‘‘;
            if($this->execute($sql)){
                $row = mysql_fetch_array($this->queryID);
                return $row;
            }else{
                return false;
            }
        }
    }

    /**
      +----------------------------------------------------------
     *  弹出错误提示,并终止运行
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     * @param string $msg 错误消息,可为空
      +----------------------------------------------------------
     */
    public static function halt($msg = ‘‘) {
        if ($msg != ‘‘) {
            $msg .= ‘\r\n‘;
        }
        $error = mysql_error();
        die($msg);
    }

    /**
      +----------------------------------------------------------
     *  获取最后一次查询ID
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
     public function getQueryId(){
         return $this->queryID;
     }
     
     /**
      +----------------------------------------------------------
     *  获取最后一次数据库操作错误信息
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function getLastError() {

        return $this->errorMsg;
    }

    /**
      +----------------------------------------------------------
     *  获取最后一次执行的SQL语句
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function getLastSql() {

        return $this->lastSql;
    }

    /**
      +----------------------------------------------------------
     *  获取最后一次插入数据库记录的索引ID号
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function getLastInsID() {
        return $this->lastInsID;
    }

    /**
      +----------------------------------------------------------
     *  获取上一次操作影响的行数
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function getAffectedRows() {
        return mysql_affected_rows($this->linkID);
    }

    /**
      +----------------------------------------------------------
     * 取得数据表的字段信息
      +----------------------------------------------------------
     * @access public
      +----------------------------------------------------------
     */
    public function getFields($tableName) {
        $result = array();
        $this->execute(‘SHOW COLUMNS FROM ‘ . $this->parseKey($tableName));
        while ($row = mysql_fetch_array($this->queryID)) {
            $result[] = $row;
        }
        $info = array();
        if ($result) {
            foreach ($result as $key => $val) {
                $info[$val[‘Field‘]] = array(
                    ‘name‘ => $val[‘Field‘],
                    ‘type‘ => $val[‘Type‘],
                    ‘notnull‘ => (bool) ($val[‘Null‘] === ‘‘), // not null is empty, null is yes
                    ‘default‘ => $val[‘Default‘],
                    ‘primary‘ => (strtolower($val[‘Key‘]) == ‘pri‘),
                    ‘autoinc‘ => (strtolower($val[‘Extra‘]) == ‘auto_increment‘),
                );
            }
        }
        return $info;
    }

    /**
      +----------------------------------------------------------
     * 字段和表名处理添加`
      +----------------------------------------------------------
     * @access protected
      +----------------------------------------------------------
     * @param string $key
      +----------------------------------------------------------
     * @return string
      +----------------------------------------------------------
     */
    protected function parseKey(&$key) {
        $key = trim($key);
        if (false !== strpos($key, ‘ ‘) || false !== strpos($key, ‘,‘) || false !== strpos($key, ‘*‘) || false !== strpos($key, ‘(‘) || false !== strpos($key, ‘.‘) || false !== strpos($key, ‘`‘)) {
            //如果包含* 或者 使用了sql方法 则不作处理
        } else {
            $key = ‘`‘ . $key . ‘`‘;
        }
        return $key;
    }

    /**
      +----------------------------------------------------------
     * 对保存到数据库的数据进行处理
      +----------------------------------------------------------
     * @access protected
      +----------------------------------------------------------
     * @param mixed $data 要操作的数据
      +----------------------------------------------------------
     * @return boolean
      +----------------------------------------------------------
     */
    private function _facade($data) {
        // 检查非数据字段
        if (!empty($this->fields)) {
            foreach ($data as $key => $val) {
                if (!array_key_exists($key, $this->fields)) {
                    unset($data[$key]);
                }
            }
        }
        return $data;
    }
    
    public function close(){
        mysql_close($this->linkID);
    }
    
    public function __destruct(){
        $this->close();
        
    }

    /*
    ** 2013.5.25新增
    */
    
    public function getPk($table){
        //将pk置为空
        $this->pk = null;
        $result = $this->getFields($table);
        foreach($result as $key => $val){
            if($val[‘primary‘]){
                $this->pk = $key;
                break;
            }
        }
        return $this->pk;
    }
    
    public function fetch(&$rst = null , $array_type = MYSQL_ASSOC){
        if($rst == null){
            $rst = $this->queryID;
        }
        if($this->queryID)
            return mysql_fetch_array($rst , $array_type);
        else
            return false;
    }

    //分解条件
    private function _parseCondition($condition , $operator=‘AND‘){
        $return = ‘‘;
        if (is_array($condition)) {
            $index = 0;
            foreach ($condition as $key => $value) {
                if ($index) {
                    $return .= " ".$operator;
                }
                $return .= "`{$key}`=‘{$value}‘";
                $index++;
            }
            return $return;
        }else{
            return false;
        }
    }

    /*事务处理开始*/
    public function beginTransaction(){
        $this->execute("START TRANSACTION");
    }

    public function commit(){
        $this->execute("COMMIT");  
    }

    public function rollback(){
        $this->execute("ROLLBACK");
    }
    /*事务处理结束*/
    
    //根据条件查找一条记录
    public function find($table,$condition = null,$field = null){
        if(is_array($condition)){
            $condition = self::_parseCondition($condition);
        }
        //处理condition和field
        $condition = $condition == null ? null : (is_array($condition) ? self::_parseCondition($condition) : $condition);
        $field = $field == null ? ‘*‘ : (is_array($field) ? implode(",",$field) : $field);
        $sql = ‘SELECT ‘ . $field . ‘ FROM ‘.$table;
        if($condition != null){
            $sql .= " WHERE " . $condition;
        }
        return $this->findOneBySql($sql);
    }
    
    //查找所有记录
    public function findAll($table,$condition = null,$field = null){
        if(is_array($condition)){
            $condition = self::_parseCondition($condition);
        }
        //处理condition和field
        $condition = $condition == null ? null : (is_array($condition) ? self::_parseCondition($condition) : $condition);
        $field = $field == null ? ‘*‘ : (is_array($field) ? implode(",",$field) : $field);
        $sql = ‘SELECT ‘ . $field . ‘ FROM ‘.$table;
        if($condition != null){
            $sql .= " WHERE " . $condition;
        }
        return $this->findallBySql($sql);
    }
    
    public function findOneBySql($sql){
        $sql .= " LIMIT 1";
        $this->execute($sql);
        return $this->fetch();
    }
    
    public function findAllBySql($sql){
        $rows = array();
        $this->execute($sql);
        while($row = $this->fetch()){
            $rows[] = $row;
        }
        return $rows;
    }
    
    public function findByPk($table,$_pk){
        $pk = $this->getPk($table);
        if($pk == null){
            $this->errorMsg = "未找到该表的主键";
            return false;
        }else{
            return $this->find($table,array(
                $pk => $_pk
            ));
        }
    }
    
    public function deleteByPk($table,$_pk){
        $pk = $this->getPk($table);
        if($pk == null){
            $this->errorMsg = "未找到该表的主键";
            return false;
        }else{
            $sql = "DELETE FROM ".$table." WHERE `{$pk}`=‘{$_pk}‘";
            return $this->delete($table,array(
                $pk => $_pk
            ));
        }
    }
    
}
/*
 * 类库更新日志  2013.5.25 
 * 1、update delete操作中的条件可以设置为数组形式$key=>$value
 * 2、增加事务处理功能(只针对innodb引擎)
 * 3、增加根据条件查找一条记录
 * 4、增加根据条件查找所有记录
 * 5、增加根据主键查找记录
 * 6、增加根据主键删除记录
 */
?>

 

mysql操作类库--摘抄,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。