仿ADODB的MySQL操作类 DB.php
MYSQL.php
<?php define(’DB_HOST’,'localhost’); // server name or IP address define(’DB_USERNAME’,'root’); // user name define(’DB_PASSWORD’,'password’); // password define(’DB_DATABASE’,'dbname’); // database name define(’DB_PREFIX’,'prefix_’); // prefix for table define(’DB_PERDURE’,false); // true : mysql_pconnect() false : mysql_connect() ?> |
DB.php
<?php require_once(realpath(dirname(__FILE__).”/../”).”/MYSQL.php”); //sohophp@gmail.com //2007-4 //http://www.zhaipeng.cn class DB{ var $conID; //数据库名称 var $database; //最后出错信息 var $lastErrorMsg; //调试开关 var $debug = false; // FetchMode var $fetchMode = MYSQL_BOTH; //PHP版本 var $PHPVERSION; //MySQL版本 var $MYSQLVERSION; // PHP.ini是否打开 magic_quotes_gpc var $magic_quotes_gpc; //编码 var $charset = ‘UTF-8′; /** * 构造函数,如果$AutoContent为真,自动连接Mysql主机并使用数据库 * * @param boolean $AutoContent 是否自动连接 * @return DB */ function DB($AutoContent = true){ if($AutoContent){ if($this->Connect(DB_HOST,DB_USERNAME,DB_PASSWORD)) $this->SelectDB(DB_DATABASE); } $this->magic_quotes_gpc = get_magic_quotes_gpc() ? true : false; } /** * 连接数据库 * * @param string $host Mysql主机 * @param string $username 用户名 * @param string $password 密码 * @return unknown */ function Connect($host,$username,$password){ $this->conID = mysql_connect($host,$username,$password) or $this->_Error(); return $this->conID; } /** * 设定编码,Mysql4.1以后版本使用,解决乱码问题 * * @param unknown_type $charset */ function SetCharset($charset = ‘UTF-8′){ $this->charset = $charset ; if($this->MysqlVersion() >= 4.1){ $this->_Query(”SET NAMES “.str_replace(”-”,”",$charset)); } } /** * 选择数据库 * * @param string $database 数据库名称 * @return unknown */ function SelectDB($database){ $this->database; $ret = mysql_select_db($database,$this->conID) or $this->_Error(); return $ret; } /** * 执行mysql_query * * @param string $sql SQL语句 * @return unknown */ function _Query($sql){ $sql = $this->PreFix($sql); if($this->debug){ echo “<p>\n”; echo “$sql\n”; echo “</p>\n”; } $result = mysql_query($sql,$this->conID) or $this->_Error(); return $result; } /** * 替换数据库名前缀 * * @param string $sql * @return unknown */ function PreFix($sql){ return str_replace(”#@#”,DB_PREFIX,$sql); } /** * 同QMagic * * @param unknown_type $str * @return unknown */ function Strip($str){ return $this->Qstr($str , $this->magic_quotes_gpc); } /** * 对字符串编码,执行htmlspecialchars * * @param string $str * @return unknown */ function HtmlEncode($str){ $ret = $this->Qstr($str , $this->magic_quotes_gpc); return htmlspecialchars($ret,ENT_QUOTES,$this->charset); } /** * post方法提交表单时取得数组,并处理安全问题,用来执行数据库操作 * 传递的参数不定,传递的参数是表单字段名,这些是用编辑器时不使用htmlspeicalchars编码 * * @return Array */ function GetPost(){ $num_args = func_num_args(); $args = func_get_args(); $post = array(); foreach($_POST as $k => $v){ if(is_array($v)){ $tmp_arr = array(); foreach($v as $v_k=>$v_v){ $tmp_arr[$v_k] = $this->HtmlEncode($v_v); } $post[$k] = implode(’,’ , $tmp_arr); continue; } if($num_args > 0 && in_array($k,$args)){ $post[$k] = $this->Qstr($v ,$this->magic_quotes_gpc); }else{ $post[$k] = $this->HtmlEncode($v); } } return $post; } /** * 类似GetPost的另一种方法,为了解决不定数语言版本网站时传递编辑器字段名的数组 * * @param Array $arr * @return unknown */ function GetPost2($arr){ $arr = empty($arr) ? array() : (array)$arr; $post = array(); foreach($_POST as $k=>$v){ if(in_array($k , $arr)){ $post[$k] = $this->Qstr($v , $this->magic_quotes_gpc); }else{ $post[$k] = $this->HtmlEncode($v); } } return $post; } /** * 如果不是SELECT语句直接执行mysql_query,否则建立新的对像,下边有DB_Result类 * * @param string $sql * @return unknown */ function Execute($sql){ $sql = trim($sql); if((strncasecmp(”SELECT”,$sql,6) == 0) || (strncasecmp(”SHOW”,$sql,4) == 0)){ $result = new DB_Result($this,$sql); return $result; }else{ return $this->_Query($sql); } } /** * 执行SELECT的SQL语句的简单方法 * * @param string $table 表名 * @param string $where 条件 * @param boolean $GetRow 是否反回记录数组 * @return unknown */ function Select($table , $where=” , $GetRow = false){ if($where != ”){ $prefix = substr(strtoupper(trim($where)),0,8); if( !in_array($prefix , array(”GROUP BY”,”ORDER BY”,”WHERE 1″))){ $where = ” WHERE $where”; } } if($GetRow !== false) return $this->GetRow(”SELECT * FROM `$table` $where”); return $this->Execute(”SELECT * FROM `$table` $where”); } /** * 新增数据 * * @param String $table 表名 * @param Array $arr 字段名和值的数组 * @return unknown */ function Insert($table,$arr =”){ $post = $this->GetPost(); if(!empty($arr)){ $post = array_merge($post,$arr); } return $this->Execute($this->GetInsertSQL($this->Select($table),$post)); } /** * 修改数据 * * @param String $table 表名 * @param String $where 条件 * @param Array $arr 字段名和值的数组 * @return unknown */ function Update($table,$where=” ,$arr = ”){ $post = $this->GetPost(); if(!empty($arr)){ $post = array_merge($post,$arr); } return $this->Execute($this->GetUpdateSQL($this->Select($table,$where),$post)); } /** * 删除数据 * * @param string $table 表名 * @param 条件 $where * @return unknown */ function Delete($table , $where = ”){ if($where != ”){ $where = ” WHERE $where”; } return $this->Execute(”DELETE FROM `$table` $where”); } /** * 查询从$offset到$max的记录 * * @param string $sql 查询语句 * @param integer $max 最多几条记录 * @param integer $offset * @return unknown */ function SelectLimit($sql,$max=0,$offset=0){ if( $max > 0 ){ $sql = sprintf(”%s LIMIT %d , %d”, $sql , $offset , $max); } return $this->Execute($sql); } /** * 执行查询反回一条记录的数组 * * @param string $sql * @return array */ function GetRow($sql){ $rs = $this->_Query(sprintf(”%s LIMIT 0,1″,$sql)); $row = mysql_fetch_array($rs,$this->fetchMode); mysql_free_result($rs); return $row; } /** * 查询一条记录的第一个字段值 * * @param unknown_type $sql * @return unknown */ function GetOne($sql){ $rs = $this->_Query(sprintf(”%s LIMIT 0,1″,$sql)); //return mysql_result($rs,0); $row = mysql_fetch_row($rs); mysql_free_result($rs); return $row[0]; } /** * 反回查询后的所有记录 * * @param string $sql * @return array */ function GetArray($sql){ $rs = $this->Execute($sql); $rows = array(); while($row = $rs->FetchRow()){ $rows[] = $row; } $rs->Close(); return $rows; } /** * 提供SQL语句反回用于表单中<select>选单的<option>, * 如 $sql = “select id , title from #@#tableName“; * 其中 id是值,title是显示的名称 <option value=”id”>title</option> * * @param string $sql * @param string $default 默认选中的值 * @return unknown */ function GetOptions($sql , $default = false){ $old_fetchMode = $this->fetchMode; $this->fetchMode = MYSQL_NUM; $rs = $this->Execute($sql); $options = ”; while($row = $rs->FetchRow()){ $selected = ”; if($row[0] == $default) $selected = ‘ selected=”selected” ‘; $options .=’<option value=”‘.$row[0].’”‘.$selected.’>’.$row[1].’</option>’.chr(10); } $rs->Close(); $this->fetchMode = $old_fetchMode; return $options; } /** * 反回最后新增记录的自动编号 * * @return unknown */ function Last_insert_id(){ return $this->GetOne(”SELECT LAST_INSERT_ID()”); } /** * 同Last_insert_id * * @return unknown */ function Insert_ID(){ return $this->Last_insert_id(); } /** * mysql_affected_rows * * @return unknown */ function Affected_Rows(){ return mysql_affected_rows($this->conID); } /** * 提供$rs对像,和字段名=>值 的数据,返回用于新增数据的SQL语句 * * @param object $rs * @param array $array * @return unknown */ function GetInsertSQL(&$rs,$array){ $field_arr = $rs->Fields(); $table = $rs->fieldTable; $sql_k = array(); $sql_v = array(); foreach($field_arr as $field){ $name = $field[’name’]; $type = $field[’type’]; $len = $field[’len’]; $flags = $field[’flags’]; if(isset($array[$name])){ $sql_k[] = “`”.$name.”`”; //if(strncasecmp(”date”,$type,4) ==0 || strncasecmp(”int”,$type,3) == 0){ // $sql_v[] = $this->Qstr($array[$name]); //}else{ $sql_v[] = “‘”.$array[$name].”‘”; //} } } $count = count($sql_k); $sql_k_str = implode(”,”,$sql_k); $sql_v_str = implode(”,”,$sql_v); $sql = “INSERT INTO $table($sql_k_str) VALUES($sql_v_str)”; unset($sql_k,$sql_v); return $sql; } /** * 提供$rs对像,和字段名=>值 的数据,返回用于修改数据的SQL语句 * * @param unknown_type $rs * @param unknown_type $array * @return unknown */ function GetUpdateSQL(&$rs,$array){ $sql = $rs->sql; $fields_arr = $rs->Fields(); $table = $rs->fieldTable; $where = ”; $sql_upper = strtoupper($sql); $pos = strpos($sql_upper,” WHERE “); if($pos !== false){ $sql_len = strlen($sql); $offset = $sql_len - $pos; if(false !== ($pos3 = strpos($sql_upper,” GROUP BY “))){ $offset = $pos3 - $pos ; }elseif(false !== ($pos3 =strpos($sql_upper,” ORDER BY “))){ $offset = $pos3 - $pos ; } $where = substr($sql,$pos,$offset); } $set_arr = array(); foreach($fields_arr as $field){ $name = $field[’name’]; $type = $field[’type’]; $len = $field[’len’]; $flags = $field[’flags’]; if(isset($array[$name])){ // if(strncasecmp(”date”,$type,4) ==0 || strncasecmp(”int”,$type,3) == 0){ // $v = $array[$name]; //}else{ $v = “‘”.$array[$name].”‘”; //} $set_arr[] =” `$name`=$v”; } } if(!empty($set_arr)){ $set = ” SET “.implode(”,”,$set_arr); }else{ $set = ” SET 1=1 “; } $sql = “UPDATE `$table` $set $where”; return $sql; } /** * 先去掉两边的空格,如果没有开启magic_quotes_gpc执行addslashes * * @param unknown_type $str * @param unknown_type $magic_quotes_gpc * @return unknown */ function Qstr($str,$magic_quotes_gpc = false){ $str = trim($str); if(!$magic_quotes_gpc){ $str = addslashes($str); } return $str; } /** * 执行Qstr * * @param unknown_type $str * @return unknown */ function QMagic($str){ return $this->Qstr($str,get_magic_quotes_gpc()); } /** * 取得MySQL版本 * * @return unknown */ function MysqlVersion(){ if(!empty($this->MYSQLVERSION)) return $this->MYSQLVERSION; $result = mysql_query(”SELECT VERSION()”,$this->conID); $row = mysql_fetch_assoc($result); foreach($row as $v){ if (preg_match(’/([0-9]+\.([0-9\.])+)/’,$v, $arr)){ $this->MYSQLVERSION = (float)$arr[1]; } } return $this->MYSQLVERSION; } /** * 取得php版本 * * @return unknown */ function PHPVERSION(){ if(!empty($this->PHPVERSION)) return $this->PHPVERSION; return PHPVERSION(); } /** * 用于加密 * * @param unknown_type $password * @return unknown */ function Password($password){ return md5($password); } /** * 返回最后的出错信息 * * @return unknown */ function ErrorMsg(){ return $this->lastErrorMsg; } /** * 记录出错信息,如果开启调试debug输出错误并停止 * * @return unknown */ function _Error(){ $this->lastErrorMsg = mysql_error(); if($this->debug && !empty($this->lastErrorMsg)){ echo $this->ErrorMsg(); exit; } return false; } /** * 设定fetchmode * * @param unknown_type $fetchMode MYSQL_NUM ,MYSQL_BOTH,MYSQL_ASSOC */ function SetFetchMode($fetchMode){ $this->fetchMode = $fetchMode; } /** * 用于调试输出 * * @param unknown_type $str */ function Debug($str){ echo “<pre>\n”; var_dump($str); echo “</ pre>\n”; // exit; } /** * 关闭连接 * * @return unknown */ function Close(){ return mysql_close($this->conID); } } /** * 查询类 * */ Class DB_Result{ /** * 查询语句 * * @var unknown_type */ var $sql; var $result; var $conID; var $object; var $fetchMode; var $currentRow = -1; var $numRows; var $numFields; var $fields_init; var $fieldTable; var $EOF = true; var $fields = array(); var $init = false; function DB_Result(&$object,$sql){ $this->sql = $sql; $this->result =& $object->_query($this->sql); $this->object =& $object; $this->conID =& $object->conID; $this->fetchMode = $object->fetchMode; $this->init(); } function init(){ $this->numRows = mysql_num_rows($this->result); $this->numFields = mysql_num_fields($this->result); if($this->_fetch()){ $this->EOF = false; }else{ $this->EOF = true; } $this->currentRow = 0 ; } function RecordCount(){ if(!is_numeric($this->numRows)){ $this->numRows = mysql_num_rows($this->result); } return $this->numRows; } function NumRows(){ return $this->RecordCount(); } function FetchRow(){ $ret = $this->fields; if($this->_Fetch()){ $this->EOF = false; }else{ $this->EOF = true ; } if($this->init) $this->currentRow += 1; else $this->init = true; return $ret; } function _Fetch(){ $this->fields = mysql_fetch_array($this->result,$this->fetchMode); return is_array($this->fields); } function Seek($offset){ if($this->numRows == 0) return false; $ret = mysql_data_seek($this->result,$offset); if($this->_Fetch()){ $this->EOF = false ; }else{ $this->EOF = true; } } function MoveNext(){ if($this->_Fetch()){ $this->EOF = false; return true; }else{ $this->EOF = true; return false; } $this->currentRow += 1; } function MoveFirst(){ $this->currentRow = 0; $this->init = false; $this->Seek(0); } function Fields(){ $this->fieldTable = mysql_field_table($this->result,0); $arr = array(); for($i=0;$i<$this->numFields;$i++){ $arr[] = array(’type’=>mysql_field_type($this->result,$i) , ‘name’=>mysql_field_name($this->result,$i), ’len’=>mysql_field_len($this->result,$i), ’flags’=>mysql_field_flags($this->result,$i)); } return $arr; } function Close(){ return mysql_free_result($this->result); } function GetOptions($sel = false){ $old_fetchMode = $this->fetchMode; $this->fetchMode = MYSQL_NUM; $options = ”; while($row = $this->FetchRow()){ $value = $row[0]; $text = isset($row[1]) ? $row[1] : $row[0]; $selected = $value == $sel ? ‘ selected=”selected” ‘ : ”; $options .=’<option value=”‘.$value.’”‘.$selected.’>’.$text.’</option>’.chr(10); } $this->MoveFirst(); $this->fetchMode = $old_fetchMode; return $options; } } ?> |


