当前位置:首页>软件介绍>PHP操作MySQL类 查询:
     
PHP操作MySQL类

<?php 

//默认的连接参数 

define('DB_HOST','localhost'); 

define('DB_NAME','db_performance'); 

define('DB_USER','root'); 

define('DB_PASSWORD','111111'); 

define('DEFAULT_CHASET','UTF8'); 

//define('SORT_UPDATE_ASC',0); 

//define('SORT_UPDATE_DESC',1); 

?> 

<?php 

/** 

* 获取规格化的列名称列表 

* @param mix $fields 

* @return array 

*/ 

function get_column_names($fields ){ 

$fieldResult= array(); //存放结果 

if(!is_array($fields)){ //不是数组的处理 

$fields= str_replace(',',' ',$fields); 

$fields= explode(' ',$fields); 

foreach($fields as $field){ 

if(trim($field) != null && !in_array($field, $fieldResult)){ //不添加重复的field value 

$fieldResult[]= $field; 

return $fieldResult; 

}else{ 

foreach( $fields as $field){ 

$arr_field= get_column_names($field); 

foreach($arr_field as $field){ 

if(!in_array($field, $fieldResult)){ //不添加重复的field 

value 

$fieldResult[]= $field; 

return $fieldResult; 

////class define code 

class MySql{ 

private $conn= null; //连接资源 

private $connect= false;//引用的数据库连接标记& 

private $referenceCount= 1;//引用计数器 

private $result= null; //查询结果资源 

private $table= null; //当前表 

private $describe= null;//连接描述 

private $sql= null; //最后执行的SQL 

private $db_host; //用于重新连接数据库的参数 

private $db_name; // 

private $db_user; // 

private $db_password; // 

private $db_chaset; // 

////set Functions 

/** 

* clone 方法已被禁用。请使用 getClone()来取代 

*/ 

function __clone(){ 

exit("can't be clone. using $mysql->getClone('$describe') instead"); 

/** 

* __construct 

* @param string $_describe 

*/ 

function __construct($describe){ 

$this->describe= $describe; 

function __destruct(){ 

$this->close(); 

/** 

* 关闭当前连接 

*/ 

function close(){ 

//free private vars 

$this->freeResult(); 

$this->sql= null; 

$this->describe= null; 

$this->table= null; 

//free reference vars 

$this->cleanReferenceData(); 

/** 

* 检查当前引用数据连接是否被其它Mysql所引用,此方法不导出。 

* @return boolean 

*/ 

private function checkReference(){ 

if($this->referenceCount >1){ 

return true; 

return false; 

/** 

* debug 

*/ 

function debug(){ 

$result= array(); 

if($this->checkReference()){ 

$result['isReference']= "true"; 

else{ 

$result['isReference']= "false"; 

$result['conn']=$this->conn; 

$result['connect']=$this->connect; 

$result['referenceC 

$result['result']=$this->result; 

$result['table']=$this->table; 

$result['describe']=$this->describe; 

$result['sql']=$this->sql; 

$result['db_host']=$this->db_host; 

$result['db_name']=$this->db_name; 

$result['db_user']=$this->db_user; 

$result['db_password']=$this->db_password; 

$result['db_chaset']=$this->db_chaset; 

print_r($result); 

/** 

* 清理引用的共享数据 

* @return true 

*/ 

//function unsetReference(){ 

private function cleanReferenceData(){ 

if($this->checkReference()){ 

$this->referenceCount --; //计数器减一 

unset($this->conn); //释放引用的数据 

unset($this->referenceCount); //释放引用的数据 

unset($this->connect); //释放引用的数据 

}else{ 

if($this->isConnected() ){ 

mysql_close($this->conn); 

$this->referenceCount= 1; //referenceCount 重置 

$this->sql= null; 

$this->conn= null; 

$this->connect= false; 

return true; 

////set&get functions 

/** 

* 设置数据连接相关描述,用于错误信息显示。 

* @param string $describe 

*/ 

function setDescribe($describe){ 

$this->describe= $describe; 

/** 

* 设置默认的表名 

* @param string $table 

* @return boolean 

*/ 

function setTable($table){ 

if($table != null){ 

$this->table= $table; 

return true; 

////get Functions 

function getDbName(){ 

return $this->db_name; 

function &getConn(){ 

if($this->isConnected()){ 

return $this->conn; 

return null; 

function getDescribe(){ 

return $this->describe; 

function getLastSql(){ 

return $this->sql; 

function getTable($table= null){ 

if($table){ 

$this->table= $table; 

if($this->table){ 

return $this->table; 

exit('no table selected error'); 

/** 

* 数据库是否连接 

* @return boolean 

*/ 

function isConnected(){ 

if($this->connect && is_resource($this->conn)){ 

return true; 

return false; 

/** 

* 连接数据库 

* 如果指定数据库名,则尝试连接指定数据库。置空则忽略连接数据库步骤,不设置则尝试连接默认数据库 

* @param string $_dbName 数据库名 

* @param string $_db_user mysql登录用户名 

* @param string $_db_password mysql登录密码 

* @param string $_db_host mysql主机 

* @return boolean 成功返回 true,失败返回false 

*/ 

function connect($db_name= DB_NAME, $db_user= DB_USER, $db_password= 

DB_PASSWORD, $db_host= DB_HOST){ 

//echo "try to connect<br>"; 

$this->close();//重新连接,则先断开原来的连接关系 

$this->conn= mysql_connect($db_host, $db_user, $db_password, true)or 

die('error at connect datebase'); 

if(!$this->conn) return false; 

$this->connect= true; 

$this->db_host= $db_host; 

$this->db_user= $db_user; 

$this->db_name= $db_name; 

$this->db_password= $db_passw 

//$this->setDefaultCharset(); 

//设置默认的字符集 

$this->query('SET NAMES '.DEFAULT_CHASET); 

$this->db_chaset= DEFAULT_CHASET; 

if($db_name != null){ 

$this->selectDb($db_name); 

return true; 

/** 

* 重新连接 

* @return boolean 

*/ 

private function reConnect(){ 

$db_name= $this->db_name; 

$db_user= $this->db_user; 

$db_password= $this->db_password; 

$db_host= $this->db_host; 

$chaset= $this->db_chaset; 

$result= $this->connect($db_name, $db_user, $db_password, $db_host); 

if($result){ 

//$this->setCharset($chaset ); 

//设置字符集 

$this->query('SET NAMES '.$chaset); 

$this->db_chaset= $chaset; 

return $result; 

/** 

* 选择数据库 

* @param string $db_name 数据库名 

* @return boolean 

*/ 

function selectDb($db_name= DB_NAME){ 

if(!$this->isConnected()){ 

return false; 

$this->freeResult(); 

$this->sql= null; 

$this->table= null; 

if($this->checkReference()){ 

$this->cleanReferenceData(); 

$this->reConnect(); 

$result= mysql_select_db($db_name, $this->conn) or die("error at selectDb: 

'{$db_name}'"); 

if($result) { 

$this->db_name= $db_name; 

return $result; 

return false; 

/** 

* 获取 mysql连接类的克隆对象。该方法将取代 clone方法 

* @param string $describe 新的描述 

* @return Mysql 

*/ 

function &getClone($describe= null){ 

if($describe == null){ 

//$describe= $this->describe.'copy of '.$this->referenceCount; 

$describe= "{$this->describe}[{$this->referenceCount}]"; 

$newMySql = new Mysql($describe);//新MySql类 

$this->referenceCount ++;//更新引用计数 

$newMySql->conn= &$this->conn; //建立引用关联 

$newMySql->referenceCount= &$this->referenceCount; 

$newMySql->connect= &$this->connect; 

$newMySql->describe= $describe; 

$newMySql->db_host= $this->db_host; 

$newMySql->db_name= $this->db_name; 

$newMySql->db_user= $this->db_user; 

$newMySql->db_password= $this->db_password; 

$newMySql->db_chaset= $this->db_chaset; 

return $newMySql; 

/** 

* 执行一条sql语句,需之前正确连接数据库 

* 注意:如果执行的是select语句,则返回的记录集自动保存在成员变量

$this->result中 

* @param string $sql 执行的sql字符串 

* @return mix 

*/ 

function query($sql){ 

if( $this->isConnected()){ 

$this->sql= $sql; 

$result= mysql_query($sql, $this->conn) 

or die("[error at {$this->describe}][query sql:'{$this->sql}']"); 

if(is_resource($result)){ 

$this->result= $result; 

return $result; 

exit($this->describe.'[unable conn]'); 

/** 

* 执行一条sql语句。此为 query()的同名方法 

* @param string $_sql 

* @return mix 

*/ 

function execute($sql){ 

return $this->query($sql); 

/** 

* 查询一条SQL语句并返回 

* 如果为select则返回第 * 

* @param string $sql 

* @param int $result_type 

* @return mix 

*/ 

function queryOnce($sql ,$result_type= MYSQL_ASSOC){//查询一条SQL语句,如果

为select则返回第一条结果 

if( $this->isConnected()){ 

$this->sql= $sql; 

$result= mysql_query($sql, $this->conn) 

or die("[error at {$this->describe}][query sql:'{$this->sql}']"); 

if(is_resource($result)){ 

$result= mysql_fetch_array($result,$result_type); 

return $result; 

exit($this->describe.'[unable $conn]'); 

/** 

* 获取select查询数据 返回 查询的索引数组 

* @param int $result_type 索引数组类型:MYSQL_BOTH/MYSQL_ASSOC/MYSQL_NUM 

* @return array 成功返回数组,失败返回false 

*/ 

function fetchArray($result_type= MYSQL_BOTH ){ 

if($this->isConnected() && is_resource($this->result)){ 

return mysql_fetch_array( $this->result, $result_type); 

return false; 

/** 

* 获取select查询数据 返回 查询的关联索引的数组 

* @return array 成功返回数组,失败返回false 

*/ 

function fetchAssoc(){ 

if($this->isConnected() && is_resource($this->result)){ 

return mysql_fetch_assoc( $this->result);//MYSQL_ASSOC 

return false; 

/** 

* 获取select查询数据 返回 查询的数字索引的数组 

* @return array 成功返回数组,失败返回false 

*/ 

function fetchNum(){ 

if($this->isConnected() && is_resource($this->result)){ 

return mysql_fetch_array( $this->result, MYSQL_NUM); 

return false; 

/** 

* 释放当前的结果集 

* @return boolean 成功返回true 

*/ 

function freeResult(){ 

if($this->isConnected() && is_resource($this->result)){ 

$result= mysql_free_result($this->result); 

$this->result = null; 

return $result; 

return true; 

/** 

* 操作影响的数据行数 

* 此方法应在执行select/update之后调用 

* @return int 

*/ 

function affectedRows(){ 

if($this->isConnected()){ 

return mysql_affected_rows($this->conn); 

return null; 

/** 

* 获取select之后的结果集中数量 

* @return int 

*/ 

function numRows(){ 

if( is_resource($this->result)){ 

$num= mysql_num_rows($this->result); 

return $num; 

return null; 

/** 

* 连接状态,状态数组信息参见 mysql_stat() 

* @return boolean 连接正常返回状态数组,已断开返回 false 

*/ 

function stat(){ 

if($this->isConnected()){ 

return mysql_stat($this->conn); 

return false; 

/** 

* 检测服务器连接,如果没有连接则重新连接 

* @return boolean 成功返回true,失败返回false 

*/ 

function ping(){ 

if($this->isConnected()){ 

return mysql_ping($this->conn); 

return null; 

/** 

* 最新插入的数据后,AUTO_INCREMENT 的 ID号 

* 该 * 

* @return int 失败返回 0 

*/ 

function insertId(){ 

if($this->isConnected()){ 

return mysql_insert_id($this->conn); 

return 0; 

/** 

* 返回无 Limit结果的数据数目。仅用于select sql_calc_rows查询之后 

* @return int 

*/ 

function foundRows(){//仅用于select sql_calc_rows查询之后 

$result= $this->queryOnce("SELECT FOUND_ROWS()",MYSQL_NUM); 

if($result) return $result[0]; 

return false; 

///set char set functions 

/** 

* 1.设置字符集 

* @param string $_chaset 

* @return 成功返回true 

*/ 

function setCharset($chaset= DEFAULT_CHASET){ 

if($this->isConnected()){ 

if($this->checkReference()){ 

$this->cleanReferenceData(); 

$this->reConnect(); 

$this->query('SET NAMES '.$chaset); 

$this->db_chaset= $chaset; 

return true; 

return false; 

/** 

* 2.设置数据连接字符集为 utf-8 

* 注意,如果有多个Mysql类共用同一个数据连接,该方法将导致当前Mysql类的连接

从原连接分离 

* @return boolean true 

*/ 

function setCharsetUtf8(){ 

return $this->setCharset('UTF8'); 

/** 

* 3.设置为默认的字符集。 

* 注意,如果有多个Mysql类共用同一个数据连接,该方法将导致当前Mysql类的连接

从原连接分离。 

* @return boolean 

*/ 

function setDefaultCharset(){ 

return $this->setCharset(DEFAULT_CHASET); 

//sort functions 

/** 

* 1.根据主键出现的先后顺序,重新排序数据表中的数据 

* 注意:仅支持排序ID的升序更新,如果是降序读取,更新的时候需先反转主键列表 

* @param mix $primaryKeys 主键列表 

* @param string $table 操作的数据表名 

* @param string $sortField 排序列名 

* @param string $primaryField 主键列名 

* @return boolean 成功返回true,失败返回false 

*/ 

function sortUpdate($primaryKeys,$table= null,$sortField='sortId',$primaryField= 'id'/*, $order_by= SORT_UPDATE_ASC*/){ 

if(!$this->isConnected()) return false; 

$table= $this->getTable($table); 

$primaryKeys= get_column_names($primaryKeys);//反序查找的需要反序更新 

/*if($order_by == SORT_UPDATE_DESC ){ 

$primaryKeys= array_reverse($primaryKeys); 

}else if($order_by != SORT_UPDATE_ASC ){ 

exit(); 

}*/ 

$newPrimaryKeySort= $primaryKeys; //新的排序 

$primaryKeys= implode(',',$primaryKeys); 

$sortSql= "select {$primaryField},{$sortField} from {$table} where 

{$primaryField} in ({$primaryKeys}) order by {$sortField} asc, {$primaryField} asc"; 

$this->query($sortSql); 

$findedPrimaryKeys= array(); //查找到的数据ID 

$updateItem= array(); //查找到的数据 

while(!!$result= $this->fetchArray(MYSQL_ASSOC)){ //整理查找到的记录结果 

$findedPrimaryKeys[]= $result[$primaryField]; //记录找到的ID,用于方便检索 

$updateItem[]= $result; //记 } 

$keyIndex= 0; //查找到的数据ID索引初始化 

foreach($newPrimaryKeySort as $sortKey){ 

if(in_array($sortKey,$findedPrimaryKeys)){ //可以查找到的有效ID 

if($sortKey != $findedPrimaryKeys[$keyIndex]){//排序不正确的才需要更新 

$update[$sortField]= $updateItem[$keyIndex][$sortField]; 

$this->update($update,"{$primaryField}= '{$sortKey}'",$table); 

$keyIndex++; //索引自加 

return true; 

/** 

* 2.对数据表中指定的数据的排序顺序进行上移/下移调整 

* offset>0则向后移动该数据;offset<0则向前移动该数据。同时更新所有受影响的数据排序 

* 仅支持排序列的升序更新,如果需要降序的更新,请把offset取负 

* 不支持排序列存在重复的情况。为了避免此问题,请总是使用此方法排序,不要手动修改数据库。此方法已完全隐蔽排序列数据。 

* @param int $primaryKey 主键 

* @param int $offset 数据位移值,0则不移动 

* @param string $table 操作的数据表 

* @param string $sortField 排序列名 

* @param string $primaryField 主键列名 

* @return boolean 成功返回true,失败返回false 

*/ 

function sort($primaryKey,$offset,$table= null,$sortField='sortId',$primaryField='id'){ 

if(!$this->isConnected()) return false; 

$table= $this->getTable($table); 

$sortSql= "select {$primaryField},{$sortField} from {$table} where 

{$primaryField}='{$primaryKey}' LIMIT 1"; 

if(!$result= $this->queryOnce($sortSql)){ 

return false;//未找到此ID数据 

$offset= intval($offset); 

$sortOrder= $result[$sortField]; 

$limiter = ($offset>0)? ($offset+1):(1- $offset); 

if($offset <0 ){ 

$sortSql= "select {$primaryField},{$sortField} from {$table} where 

$sortField <= '{$sortOrder}' order by {$sortField} desc, {$primaryField} desc limit 

{$limiter}"; 

}elseif($offset > 0){ 

$sortSql= "select {$primaryField},{$sortField} from {$table} where 

$sortField >= '{$sortOrder}' order by {$sortField} asc, {$primaryField} asc limit 

{$limiter}"; 

}else{ 

return true;//0无须排序 

$this->query($sortSql); 

$sortArray= array(); 

$result= $this->fetchAssoc(); //如果数据库无错误,则第一条记录为要查找的数据ID(通常都能找到,除非数据库数据不正确) 

if($result[$primaryField] == $primaryKey){ //find the id 

$sortArray[]= $result[$primaryField]; //save 

}else{ 

//重复的sortID导致查找失败,或者未找到的数据记录 

return false; 

//获取剩下的数据记录 

while(!!$result= $this->fetchAssoc()){ 

$sortArray[]= $result[$primaryField]; 

$head= array_shift($sortArray); //移除队列头元素(查找的元素本身) 

array_push($sortArray,$head); //将查找元素添加到数组末尾 

if($offset <0){//反序查找的数据需要反序排序 

$sortArray= array_reverse($sortArray); 

if(!em return 

$this->sortUpdate($sortArray,$table,$sortField,$primaryField); 

return false; 

// 

/** 

* 简化的select sql语句封装 

* @param mix $field_names 选择的列,数组或以','分开的选项列字符串 

* @param string $condition 条件字符串 

* @param string $parameters 附加参数字符串 limit、order by 等 

* @param string $table 操作的表名 

* @return resource 

*/ 

function select($field_names= '*', $condition= null, $parameters= null, $table= 

null){ 

if(!$this->isConnected()){ 

return false; 

$table= $this->getTable($table); 

$field_names= get_column_names($field_names); 

$field_names= implode(', ',$field_names); 

if(empty($field_names)) $field_names= '*'; 

$condition= trim($condition); 

if(!empty($condition)){ 

$condition= ' where '.$condition; 

//Make sql 

$sql= "select {$field_names} from {$table} {$condition} {$parameters}"; 

$result= $this->query($sql); 

if(is_resource($result)){ 

$this->result= $result; 

return $result; 

/** 

* 简化的insert语句操作封装 

* @param mix $arr_fields 插入的数据数组 insert[fieldname]=fieldvalue。如果数据较少可以直接写字符串 

* @param string $table 操作的数据表名 

* @return boolean 返回insert操作的结果 

*/ 

function insert($arr_fields, $table= null){ 

if(!$this->isConnected()) return false; 

$table= $this->getTable($table); 

$field_values= null; 

if(is_array($arr_fields)){ 

$arr_keys= array(); 

$arr_values= array(); 

foreach($arr_fields as $key => $value ){ 

array_push($arr_keys, $key); 

array_push($arr_values, "'{$value}'"); 

$keys= implode(', ', $arr_keys); 

$values= implode(', ', $arr_values); 

$field_values= "({$keys}) values ({$values})"; 

}else{ 

$field_values= $arr_fields; 

//Make sql 

$sql= "insert into {$table} {$field_values}"; 

return $this->query($sql); 

/** 

* 简化的 update操作封装 

* @param mix $arr_fields 更新的列数组 

* @param string $condition 更新的条件 

* @param string $table 操作的数据表名 

* @return boolean 返回操作结果 

*/ 

function update($arr_fields, $condition, $table= null){ 

if(!$this->isConnected()){ 

return false; 

$table= $this->getTable($table); 

$field_values= null; 

if(is_array($arr_fields)){ 

$fields_array= array(); 

foreach($arr_fields as $key => $value ){ 

array_push($fields_array, "{$key}= '{$value}'"); 

$field_values= implode(', ', $fields_array); 

}else{ 

$field_values= $arr_fields; 

$condition= trim($condition); 

if(!empty($condition)){ 

$condition= ' where '.$condition; 

$sql= "update {$table} set {$field_values} {$condition}"; 

return $this->query($sql); 

/** 

* 简化的 delete操作封装 

* @param string $condition 删除的条件字符串 

* @param string $table 删除 * @return boolean 

*/ 

function delete($condition, $table= null){ 

if(!$this->isConnected()) return false; 

$table= $this->getTable($table); 

$condition= trim($condition); 

if(!empty($condition)){ 

$condition= ' where '.$condition; 

$sql= "delete from {$table} {$condition}"; 

return $this->query($sql); 



仓储物资管理系统电子车间条码管理系统解决方案
集控条码仓储管理系统基于PLC控制的自动洗车系统设计
基于条码生产过程管理系统联合仓储管理系统
上门洗车软件什么是WMS条码仓储物流系统?
什么是无水洗车洗车房管理系统数据库课程设计
MySQL参照完整性MySQL客户工具和API
MySQL用户授权navicat与mysql详解
基于MySQL数据库结构设计查看MySQL连接数状态
信息发布:广州名易软件有限公司 http://www.myidp.net
  • 名易软件销售服务
  • 名易软件销售服务
  • 名易软件技术服务

  • PHP操作MySQL类