仿ADODB的MySQL操作类 DB.php

一 4th, 2008

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;
  }
 
}
?>
标签: , ,
目前还没有任何评论.