<!--?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操作类库--摘抄
时间: 2024-12-13 16:30:44